Як я можу обмежити пропускну здатність, яку використовує процес?


42

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

Чи можна обмежити максимально дозволену пропускну здатність процесу мережевим інтерфейсом? Я хотів би обмежити передачу файлів на основі SSH лише половиною моєї доступної пропускної здатності. Це може бути на стороні сервера або клієнта; тобто я би радий це зробити або на клієнті, який ініціює з'єднання, або на сервері, який отримує з'єднання.

(На жаль, я не можу додати інтерфейс, призначений для резервного копіювання. Я міг би збільшити свою доступну пропускну спроможність, але це означатиме лише, що передача мережі буде завершена швидше, але все ж максимум загальна потужність з'єднання, роблячи це.)


Деякі передумови

Можливо, якийсь фон в порядку. Відступивши, у мене виникла проблема з недостатнім місцевим простором для створення резервної копії. Введіть SSHFS! Резервна копія зберігається на нібито локальному диску, щоб ніколи не було жодних бітів резервного копіювання на самому веб-сервері.

Чому це важливо? Тому що це, здавалося б, скасує використання поважних rsync --bwlimit. rsyncнасправді не робить передачу, а також не може, тому що я навіть не можу зекономити місце для збереження резервного файлу.

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

сумне обличчя



1
Ще одна можливість для моєї ситуації, яка, до речі, точно не відповідає конкретному питанню, полягає у використанні ioniceдля придушення записів, які може зробити процес. Оскільки я пишу у файлову систему SSHFS, я можу скинути клас процесу резервного копіювання до 3, щоб повністю поступитися місцем будь-якому іншому процесу, який хоче записати. Таким чином я отримую ефект, який я хочу, а це ніколи не погіршувати досвід відвідувачів сайту через пропускну здатність резервного копіювання.
Веслі

Одне питання, ваш ssh використовує стиснення? "Стиснення так" до вашого .ssh / config?
Златко

Відповіді:


25

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

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

Збіг - Kerpid-власник
ядра 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


Я думаю, що це пов'язано з моїм рішенням, щоб найкраще це зробити. - власник процесу фактично не вибирається на основі процесу, але власник процесу. Мені доведеться створити спеціального користувача, щоб запустити процес як і потім фільтрувати на основі цього власника, так що я можу бути впевнений, що я формую трафік саме з цього конкретного процесу, а не, скажімо, декількох демонів, які могли бути запущені з загальний користувач.
Веслі

@Wesley Це не те, про що пише сторінка 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 - це портативний легкий формувач пропускної спроможності користувачів. Він може працювати в режимі спільної роботи (разом із стружкою) або в автономному режимі.

ручка працює, скориставшись передзавантаженням навантажувача Unix. По суті, він надає додатку нову версію функціоналу, необхідного для надсилання та отримання даних через сокети. Потім він обмежує трафік на основі затримки надсилання та отримання даних через сокет. трикол працює повністю в просторі користувачів і не вимагає привілеїв root.


1
Це той, що вирішив мою проблему. У мене виникли проблеми з демоном біткойна, який випадковим чином висмоктує весь мій пропускний шлях, коли клієнт вирішив, що я є людиною, з якої слід завантажити весь блокчейн.
всезнайко

trickleПосилання ви дали призводить до 404.
Geremia

Я виправив ламану ланку (замінивши її посиланням Wayback Machine).
G-Man каже: "Відновіть Моніку"

3
Начебто зараз Trickle є на Github
Гепард

абоsudo apt-get install trickle
ggll

22

Якщо ви можете записати на трубку (або 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.

Це насправді відповідь, яку я думаю, я використаю! Однак це не зовсім відповідь на конкретне питання, яке я спочатку задавав. На жаль, питання питання перешкодило, але все ще було зосереджено на обмеженні швидкості мережі в процесі. Однак ви можете внести свій внесок у це нове запитання, яке я задав: unix.stackexchange.com/q/34174/4232
Веслі

Дякую! Я робив подібну річ і закінчив робити ssh my-remote-server bash -c "'find / -xdev|cpio -o|gzip -c1'"|pv --rate-limit 1M > my-remote-root.cpio.gz.
клак

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.


4

Як ви передаєте дані? (rsync за ssh? scp? sftp? щось інше?)

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

Крім того, ви можете встановити qdisc або еквівалент, щоб зробити обмеження швидкості фантазії, але я підозрюю, що у вашому випадку це буде серйозною надмірністю. Документацію щодо цього можна отримати в розділі Linux Advanced Advanced Routing and Control HOWTO

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.