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


32

Я шукаю спосіб обмежити процес диска io до встановленого обмеження швидкості. В ідеалі програма працювала б так:

$ limitio --pid 32423 --write-limit 1M

Обмеження швидкості запису 32423 на 1 мегабайт в секунду.

Відповіді:


33

Це, звичайно, не тривіальна задача, яку неможливо виконати в просторі користувачів. На щастя, це можливо зробити на Linux, використовуючи cgroupмеханізм і його контролер blkio .

Налаштування cgroup - це певне розповсюдження, оскільки воно вже може бути десь встановлено або навіть використане. Ось загальна ідея, проте (якщо у вас правильна конфігурація ядра):

mount -t tmpfs cgroup_root /sys/fs/cgroup
mkdir -p /sys/fs/cgroup/blkio
mount -t cgroup -o blkio none /sys/fs/cgroup/blkio

Тепер, коли у вас встановлений blkioконтролер, ви можете ним користуватися:

mkdir -p /sys/fs/cgroup/blkio/limit1M/
echo "X:Y  1048576" > /sys/fs/cgroup/blkio/limit1M/blkio.throttle.write_bps_device 

Тепер у вас є група, limit1Mяка обмежує швидкість запису на пристрої з великими / незначними числами X: Y до 1 МБ / с. Як бачимо, ця межа обмежена на пристрій. Все, що вам потрібно зробити зараз, - це помістити якийсь процес у цю групу, і його слід обмежити:

echo $PID > /sys/fs/cgroup/blkio/limit1M/tasks

Я не знаю, чи / як це можна зробити в інших операційних системах.


3
Зауважте, що спочатку потрібно встановити загальну політику пристрою, щоб створити підгрупи, тобто echo "X:Y 1073741824" > /sys/fs/cgroup/blkio/blkio.throttle.write_bps_deviceви отримаєте X і Y, тобтоls -l /dev/sda
dothebart

cgroup v1 не підтримує після кешування кеша. Це означає, що тестування простого запису команд dd у стандартний файл у файловій системі (а не на пристрої), ймовірно, не покаже жодних обмежень. Якщо не використовувати жодного способу списання, буде працювати: dd ... oflag=directбуде працювати, як очікувалося. cgroup v2 може це впоратися, якщо файлова система підтримує його. Детальніше: Використання груп для обмеження вводу-виводу
AB

22

ioniceз util-linuxробить щось подібне до того, що ви хочете.

Він не встановлює абсолютних обмежень вводу-виводу, він встановлює пріоритет введення-виведення та «приємність» - подібний до того, що nice пріоритету процесора ».

На чоловіковій сторінці:

ionice - встановити або отримати клас планування вводу / виводу процесу та пріоритет

ОПИС
Ця програма встановлює або отримує клас планування вводу-виводу та пріоритет для
програма. Якщо ніяких аргументів або просто -p не вказано, ionice запитає
поточний клас планування вводу / виводу та пріоритет цього процесу.

Коли команда задана, ionice виконає цю команду із заданою
аргументи. Якщо клас не вказаний, команда буде виконуватися
з класом планування "найкращих зусиль". Стандартний рівень пріоритету - 4.

5
Слід пам’ятати, що він працює лише з CFQпланувальником вводу-виводу. У багатьох сучасних системах встановлена ​​система deadlineза умовчанням.
Highstaker

8

systemd забезпечує обгортку для викликів процесів, якими керує група. Із невідової сторінки системи (1):

Наступна команда викликає інструмент updatedb (8), але знижує вагу IO блоку для нього до 10. Див. Systemd.resource-control (5) для отримання додаткової інформації про властивість BlockIOWeight =.
systemd-run -p BlockIOWeight=10 updatedb

Подумайте про --scopeможливість використання програми для systemd-runзапуску програми на передньому плані.


7

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

Я б запропонував щось подібне:

systemd-run -p "IOWriteBandwidthMax=/dev/sdX 1M" updatedb

або застаріла версія:

systemd-run -p "BlockIOWriteBandwidth=/dev/sdX 1M" updatedb

Однак це не відповідає питанню, оскільки його не можна використовувати для вже запущеного процесу, але, можливо, це корисно в деяких інших випадках.

Посилання:

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