Как дросселировать на процесс ввода / вывода до максимального предела?


32

Я ищу способ ограничить диск процесса IO до установленного ограничения скорости. В идеале программа будет работать примерно так:

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

Ограничение процесса 32423 до 1 мегабайта в секунду скорости записи на жесткий диск.

Ответы:


33

Это, конечно, не тривиальная задача, которую нельзя выполнить в пространстве пользователя. К счастью, это можно делать на Linux, используя cgroupmechanizm и его контроллер 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 

Теперь у вас есть cgroup, 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, т. ls -l /dev/sda
Е.

cgroup v1 не поддерживает обратную запись в кеш. Это означает, что тестирование простой записи команды dd в стандартный файл в файловой системе (а не на устройство), вероятно, не покажет каких-либо ограничений. Не использовать обратную запись будет работать: dd ... oflag=directбудет работать как положено. cgroup v2 может справиться с этим, если файловая система поддерживает это. Подробности: Использование cgroups для ограничения ввода / вывода
AB

22

ioniceиз util-linuxчего-то похожего на то, что вы хотите.

Он не устанавливает абсолютных пределов ввода-вывода, он устанавливает приоритет ввода-вывода и «правильность» - аналогично тому, что niceделает для процесса приоритет процессора.

Со страницы руководства:

ionice - установить или получить класс планирования ввода-вывода и приоритет

ОПИСАНИЕ
Эта программа устанавливает или получает класс планирования ввода-вывода и приоритет для
программа. Если аргументы не заданы или задан только -p, ionice запросит
текущий класс планирования ввода-вывода и приоритет для этого процесса.

Когда дается команда, ionice будет запускать эту команду с заданным
аргументы. Если класс не указан, команда будет выполнена
с классом планирования "из лучших сил". Уровень приоритета по умолчанию - 4.

5
Следует помнить, что он работает только с CFQпланировщиком ввода-вывода. Во многих современных системах deadlineодна из них включена по умолчанию.
Highstaker

8

systemd предоставляет оболочку для вызовов процессов, управляемых cgroup. Со страницы руководства systemd-run (1):

Следующая команда вызывает инструмент updatedb (8), но снижает вес блока ввода-вывода для него до 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.