Ответы:
Это, конечно, не тривиальная задача, которую нельзя выполнить в пространстве пользователя. К счастью, это можно делать на Linux, используя cgroup
mechanizm и его контроллер 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
Я не знаю, если / как это можно сделать в других операционных системах.
dd ... oflag=direct
будет работать как положено. cgroup v2 может справиться с этим, если файловая система поддерживает это. Подробности: Использование cgroups для ограничения ввода / вывода
ionice
из util-linux
чего-то похожего на то, что вы хотите.
Он не устанавливает абсолютных пределов ввода-вывода, он устанавливает приоритет ввода-вывода и «правильность» - аналогично тому, что nice
делает для процесса приоритет процессора.
Со страницы руководства:
ionice - установить или получить класс планирования ввода-вывода и приоритет ОПИСАНИЕ Эта программа устанавливает или получает класс планирования ввода-вывода и приоритет для программа. Если аргументы не заданы или задан только -p, ionice запросит текущий класс планирования ввода-вывода и приоритет для этого процесса. Когда дается команда, ionice будет запускать эту команду с заданным аргументы. Если класс не указан, команда будет выполнена с классом планирования "из лучших сил". Уровень приоритета по умолчанию - 4.
CFQ
планировщиком ввода-вывода. Во многих современных системах deadline
одна из них включена по умолчанию.
systemd предоставляет оболочку для вызовов процессов, управляемых cgroup. Со страницы руководства systemd-run (1):
Следующая команда вызывает инструмент updatedb (8), но снижает вес блока ввода-вывода для него до 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
, т.ls -l /dev/sda