Відповіді:
Це, звичайно, не тривіальна задача, яку неможливо виконати в просторі користувачів. На щастя, це можливо зробити на 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
Я не знаю, чи / як це можна зробити в інших операційних системах.
dd ... oflag=direct
буде працювати, як очікувалося. cgroup v2 може це впоратися, якщо файлова система підтримує його. Детальніше: Використання груп для обмеження вводу-виводу
ionice
з util-linux
робить щось подібне до того, що ви хочете.
Він не встановлює абсолютних обмежень вводу-виводу, він встановлює пріоритет введення-виведення та «приємність» - подібний до того, що nice
пріоритету процесора ».
На чоловіковій сторінці:
ionice - встановити або отримати клас планування вводу / виводу процесу та пріоритет ОПИС Ця програма встановлює або отримує клас планування вводу-виводу та пріоритет для програма. Якщо ніяких аргументів або просто -p не вказано, ionice запитає поточний клас планування вводу / виводу та пріоритет цього процесу. Коли команда задана, ionice виконає цю команду із заданою аргументи. Якщо клас не вказаний, команда буде виконуватися з класом планування "найкращих зусиль". Стандартний рівень пріоритету - 4.
CFQ
планувальником вводу-виводу. У багатьох сучасних системах встановлена система deadline
за умовчанням.
systemd забезпечує обгортку для викликів процесів, якими керує група. Із невідової сторінки системи (1):
Наступна команда викликає інструмент updatedb (8), але знижує вагу IO блоку для нього до 10. Див. Systemd.resource-control (5) для отримання додаткової інформації про властивість BlockIOWeight =.
systemd-run -p BlockIOWeight=10 updatedb
Подумайте про --scope
можливість використання програми для systemd-run
запуску програми на передньому плані.
Відповідь fche - дуже хороший натяк, дякую за це, хоча це насправді не вирішує проблему, оскільки питання полягав у обмеженні процесу певною пропускною здатністю.
Я б запропонував щось подібне:
systemd-run -p "IOWriteBandwidthMax=/dev/sdX 1M" updatedb
або застаріла версія:
systemd-run -p "BlockIOWriteBandwidth=/dev/sdX 1M" updatedb
Однак це не відповідає питанню, оскільки його не можна використовувати для вже запущеного процесу, але, можливо, це корисно в деяких інших випадках.
Посилання:
echo "X:Y 1073741824" > /sys/fs/cgroup/blkio/blkio.throttle.write_bps_device
ви отримаєте X і Y, тобтоls -l /dev/sda