Как ограничить полосу пропускания, используемую процессом?

Как ограничить полосу пропускания, используемую процессом?

У меня есть сервер CentOS 5.7, который будет делать резервные копии своих файлов каждую ночь. Я обеспокоен тем, что посетители различных сайтов, размещенных на сервере, будут испытывать снижение производительности, пока резервная копия передается по сети.

Можно ли ограничить максимально допустимую пропускную способность процесса на сетевом интерфейсе? Я хотел бы ограничить передачу файлов на основе SSH только половиной доступной мне пропускной способности. Это может быть на стороне сервера или клиента; то есть я был бы рад сделать это либо на клиенте, который инициирует соединение, либо на сервере, который принимает соединение.

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


Некоторая предыстория

Возможно, стоит рассказать предысторию. Возвращаясь назад, у меня возникла проблема с нехваткой локального пространства для создания самой резервной копии. Введите SSHFS! Резервная копия сохраняется на том, что якобы является локальным диском, так что на самом веб-сервере никогда не оказывается никаких резервных копий.

Почему это важно? Потому что это, казалось бы, делает недействительным использование почтенного rsync --bwlimit. rsyncна самом деле не делает передачу, ниможетэто потому, что у меня даже нет места для сохранения файла резервной копии.

Я слышу, как вы спрашиваете: «Так, подождите, зачем вам вообще нужно делать резервную копию? Почему не просто rsyncисходные файлы и папки?» Потому что в дело вступает раздражающая штука под названием «Plesk»! Это мой клиентский веб-хостинг, который использует Plesk для удобства. Поэтому я использую Plesk для инициирования резервного копирования, потому что Plesk добавляет в резервную копию всевозможные дополнительные магические эффекты, которые делают ее использование во время процедуры восстановления очень безопасным.

грустное лицо

решение1

Один из вариантов, который я только что обнаружил, — это использоватьtrickle.

trickleэто портативный легкий формирователь полосы пропускания пользовательского пространства. Он может работать в режиме совместной работы (вместе с trickled) или в автономном режиме.

trickleработает, используя предварительную загрузку загрузчика Unix. По сути, он предоставляет приложению новую версию функциональности, которая требуется для отправки и получения данных через сокеты. Затем он ограничивает трафик, откладывая отправку и получение данных через сокет. работает trickleполностью в пользовательском пространстве и не требует привилегий root.

Для пользователей Ubuntu установите его, запустив

sudo apt install trickle

И в качестве примера запустим maven buildего, ограничив скорость загрузки до 20 кБ/с и скорость отправки до 111 кБ/с:

trickle -sd 20 -u 111 mvn build

решение2

Вы можете использовать iptablesдля маркировки пакета (--pid-owner ...), а затем использовать tcдля формирования трафика. Также "--sid-owner" можно использовать для включения потоков и потомков этого процесса.

http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#OWNERMATCH

Соответствовать --pid-владелец
Ядро2.3, 2.4, 2.5 и 2.6
Пример iptables -A ВЫВОД -m владелец --pid-владелец 78
Объяснение Это соответствие используется для сопоставления пакетов на основе идентификатора процесса (PID), который за них отвечал. Это соответствие немного сложнее в использовании, но одним из примеров может быть только разрешение PID 94 отправлять пакеты из порта HTTP (конечно, если процесс HTTP не является потоковым). В качестве альтернативы мы могли бы написать небольшой скрипт, который извлекает PID из вывода ps для определенного демона, а затем добавляет для него правило. Например, у вас может быть правило, как показано в примере Pid-owner.txt

решение3

Если вы можете писать в канал (или stdout), вы можете установить pvкоманду (pipe viewer). Первоначально она была написана для отображения хода передачи данных через канал.

tar cvf - /files/to/backup | pv -L 512k > /your/file/on/sshfs

   -L RATE, --rate-limit RATE
          Limit the transfer to a maximum of RATE  bytes  per  second.   A
          suffix of "k", "m", "g", or "t" can be added to denote kilobytes
          (*1024), megabytes, and so on.

решение4

Как вы передаете данные? (rsync через ssh? scp? sftp? что-то еще?)

rsync позволит вам ограничить пропускную способность (см. параметр --bwlimit=KBPS). rsync -e ssh --bwlimit ..

В качестве альтернативы вы можете настроить qdisc или эквивалент для ограничения скорости, но я подозреваю, что в вашем случае это будет серьезным излишеством. Документация по этому вопросу доступна по адресуLinux Advanced Routing and Traffic Control HOWTO (Расширенная маршрутизация и управление трафиком в Linux)

Связанный контент