Ограничить максимальное количество одновременных процессов scp, запущенных на хосте

Я столкнулся с проблемой, когда у меня есть парк серверов, который содержит много данных. Каждый из хостов запускает много экземпляров определенного процесса p1, что делает несколько подключений scp к другим хостам параллельно, чтобы получить данные, которые он должен обрабатывать. Это, в свою очередь, накладывает большую нагрузку на эти хосты, и много раз они спускаются.

Я ищу способы, с помощью которых я могу ограничить количество параллельных процессов scp, которые могут выполняться на одном хосте.

Большинство ссылок указывали на настройки MaxStartup & MaxSessions в / etc / ssh / sshd_config, которые были в большей степени связаны с ограничением количества сеансов ssh, которые могут быть сделаны / инициированы в любой заданной точке и т. Д.

Есть ли специальный файл конфигурации для scp, который можно использовать здесь? Или есть ли способ на системном уровне ограничить количество экземпляров определенного процесса / команды, которые могут запускаться одновременно за раз?

  • как scp в mc (и помните)?
  • Переименование файлов после выталкивания файлов с одинаковыми именами с разных серверов
  • Подавить сообщение сервера в rsync
  • Как передавать файлы по ssh, а также изменять их разрешения на удаленном сервере без необходимости входа в систему дважды
  • SCP с одного сервера на другой без запроса пароля
  • Какова цель -i перед командами scp и ssh?
  • Как включить локальную ~ автозаполнение для scp?
  • Копирование файлов между двумя хостами
  • One Solution collect form web for “Ограничить максимальное количество одновременных процессов scp, запущенных на хосте”

    Сам scp не имеет такой функции. С помощью GNU parallel вы можете использовать команду sem (из семафора ) для произвольного ограничения одновременных процессов:

     sem --id scp -j 50 scp ... 

    Для всех процессов, --id с того же --id , это ограничивает 50 одновременных экземпляров. Попытка запустить 51-й процесс будет ждать (неопределенно) до тех пор, пока не выйдет один из других процессов. Добавьте --fg чтобы сохранить процесс на переднем плане (по умолчанию это запустить его в фоновом режиме, но это не ведет к тому же фонового процесса оболочки).

    Обратите внимание, что состояние хранится в ${HOME}/.parallel/ поэтому это не будет работать так, как вы надеялись, если у вас несколько пользователей, использующих scp , для каждого пользователя может потребоваться нижний предел. (Также должно быть возможно переопределить переменную среды HOME при вызове sem , убедитесь, что umask разрешает групповую запись и модифицирует разрешения, чтобы они делили состояние, я не тестировал это сильно, хотя YMMV.)

    parallel требуется только perl и несколько стандартных модулей.

    Вы можете также рассмотреть возможность использования scp -l N где N – предел передачи в kBps, выберите конкретный шифр (для скорости, в зависимости от вашей требуемой безопасности) или отключите сжатие (особенно если данные уже сжаты), чтобы еще больше снизить влияние ЦП ,

    Для scp ssh эффективно представляет собой трубу, и экземпляр scp запускается на каждом конце (конец приема работает с недокументированной опцией -t ). Что касается MaxSessions , это не поможет, «сеансы» мультиплексируются по одному SSH-соединению. Несмотря на обильную дезинформацию об обратном, MaxSessions ограничивает только мультиплексирование сеансов на TCP-соединение, а не какой-либо другой предел.

    Модуль PAM pam_limits поддерживает ограничение одновременных логинов, поэтому, если OpenSSH построен с PAM, а usePAM yes присутствует в sshd_config вы можете установить лимит по имени пользователя, членству в группе (и т. Д.). Затем вы можете установить жесткие maxlogins для ограничения входа в /etc/security/limits.conf . Однако это подсчитывает все логины для каждого пользователя, а не только новые логины, используя только ssh , а не только scp , поэтому вы можете столкнуться с проблемами, если у вас нет выделенного идентификатора пользователя scp . После включения он будет также применяться к интерактивным сеансам ssh. Один из способов – скопировать или sshd двоичный файл sshd , вызывая его sshd-scp тогда вы можете использовать отдельный файл конфигурации PAM, то есть /etc/pam.d/sshd-scp (OpenSSH вызывает pam_start() с именем службы msgstr "установлен в бинарный файл, который был вызван как). Вам нужно будет запустить это на отдельном порту (или IP), и использование отдельного sshd_config , вероятно, тоже хорошая идея. Если вы реализуете это, тогда scp завершится с ошибкой (код выхода 254), когда будет достигнут предел, поэтому вам придется иметь дело с этим в процессе передачи.

    (Другие варианты включают cpulimit и cpulimit , это может привести к тайм-ауту сеансов scp или зависанию в течение длительного времени, что вызовет больше проблем.)

    Старая школа способ сделать что-то подобное – использовать atd и batch , но это не обеспечивает настройку параллелизма, она atd очередь и запускает процессы, когда нагрузка ниже определенного порога. Более новая вариация в этом случае – диспетчер задач, который поддерживает очередность и выполнение заданий в более настраиваемом последовательном / параллельном режиме, с поддержкой переконфигурации времени выполнения (например, изменение заданий в очереди и параметров параллелизма), хотя он не требует управления нагрузкой или процессором.

    Linux и Unix - лучшая ОС в мире.