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

42

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

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

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


Некоторый Фон

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

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

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

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

Wesley
источник
1
См. Serverfault.com/questions/52027/…
Джефф Ферланд
1
Еще одна возможность для моей ситуации, которая, кстати, не совсем отвечает на конкретный вопрос, заключается в использовании ioniceдля регулирования записи, которую может сделать процесс. Поскольку я пишу в файловую систему SSHFS, я могу снизить класс процесса резервного копирования до 3, чтобы он полностью уступил любому другому процессу, который хочет писать. Таким образом, я получаю эффект, который я хочу - никогда не ухудшать впечатления посетителя сайта из-за пропускной способности резервного копирования.
Уэсли
Один вопрос, ваш SSH использует сжатие? "Сжатие да" для вашего .ssh / config?
Златко

Ответы:

25

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

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

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

Мирча Вуцовичи
источник
Я думаю, что это связано с моим решением для лучшего способа сделать это. --pid-owner фактически выбирает не на основе процесса, а на владельца процесса. Мне нужно создать специального пользователя для запуска процесса, а затем выполнить фильтрацию на основе этого владельца, чтобы быть уверенным, что я формирую трафик только из этого конкретного процесса, а не, скажем, из нескольких демонов, которые могли быть запущены из универсальный пользователь.
Уэсли
@ Уэсли Это не то, что говорит man-страница: « --pid-owner processidСоответствует, если пакет был создан процессом с заданным идентификатором процесса ». linux.die.net/man/8/iptables
Ajedi32
Этот ответ был бы намного лучше, если бы он включал пример того, как использовать iptables и tc для этой цели. Данный iptables -A OUTPUT -m owner --pid-owner 78пример не кажется законченным (поскольку он только сопоставляет пакеты, он не говорит, как «пометить» их) и tcвообще не объясняется.
Ajedi32
Чтобы пометить пакет, нужно добавить что-то вроде -j MARK --set-mark 1. Для более подробной информации смотрите: wiki.archlinux.org/index.php/…
Мирча Вутцовичи
40

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

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

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

Wesley
источник
1
Это тот, который решил мою проблему. У меня была проблема с биткойн-демоном, беспорядочно высасывающим всю мою полосу пропускания, когда клиент решил, что я тот человек, с которого ему следует скачать весь блокчейн.
Всезнающий
trickleСсылку вы дали приводит к 404.
Geremia
Я исправил неработающую ссылку (заменив ее ссылкой на Wayback Machine).
G-Man говорит «Восстановить Монику»
3
Трикл, кажется, сейчас на github: github.com/mariusae/trickle
Гепард
илиsudo apt-get install trickle
ggll
22

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

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.
hhaamu
источник
Это на самом деле ответ, я думаю, я буду использовать! Однако это не совсем ответ на конкретный вопрос, который я изначально задавал. Увы, вопрос немного изменился, но все же был сосредоточен на ограничении скорости сетевого процесса. Тем не менее, вы можете внести свой вклад в этот новый вопрос, который я задал: unix.stackexchange.com/q/34174/4232
Wesley
Благодарность! Я делал то же самое и заканчивал тем, что делал ssh my-remote-server bash -c "'find / -xdev|cpio -o|gzip -c1'"|pv --rate-limit 1M > my-remote-root.cpio.gz.
Clacke
1
Можно было бы также объединить его с ionice, но это не разрешалось на этом конкретном сервере. ssh my-remote-server ionice -c3 bash -c "'find / -xdev|cpio -o|gzip -c1'"|pv --rate-limit 1M > my-remote-root.cpio.gz
Clacke
6

Я использую rsync с опцией --bwlimit = KBPS по той же причине.

Наша 1-гигабитная сеть Ethernet легко может забить наш старый SCSI320 DAS RAID, и, по сути, некоторые из наших старых производственных систем DOS, которые используют его для своих хранилищ NFS.

Magellan
источник
4

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

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

В качестве альтернативы, вы можете установить qdisc или его эквивалент, чтобы ограничить причудливую скорость, но я подозреваю, что в вашем случае это будет серьезным излишним. Документация по этому вопросу доступна в HOWTO по расширенной маршрутизации и управлению трафиком в Linux.

Девдас
источник