Это, конечно, не тривиальная задача, которую нельзя выполнить в пространстве пользователя. К счастью, это можно делать на 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контроллер, вы можете использовать его:
Теперь у вас есть cgroup, limit1Mкоторая ограничивает скорость записи на устройстве с большими / младшими числами X: Y до 1 МБ / с. Как видите, это ограничение на устройство. Все, что вам нужно сделать сейчас, это поместить какой-то процесс в эту группу, и он должен быть ограничен:
echo $PID > /sys/fs/cgroup/blkio/limit1M/tasks
Я не знаю, если / как это можно сделать в других операционных системах.
Обратите внимание, что сначала вам нужно установить общую политику устройства, чтобы создать подгруппы 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.
Следует помнить, что он работает только с 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запустить программу на переднем плане.
Ответ fche - очень хороший совет , спасибо за это, хотя это не решило проблему, потому что вопрос заключался в том, чтобы ограничить процесс определенной полосой пропускания.
Тем не менее, этот вопрос не подходит, потому что его нельзя использовать для уже запущенного процесса, но, возможно, это полезно в некоторых других случаях.
echo "X:Y 1073741824" > /sys/fs/cgroup/blkio/blkio.throttle.write_bps_device
, т.ls -l /dev/sda
dd ... oflag=direct
будет работать как положено. cgroup v2 может справиться с этим, если файловая система поддерживает это. Подробности: Использование cgroups для ограничения ввода / выводаionice
изutil-linux
чего-то похожего на то, что вы хотите.Он не устанавливает абсолютных пределов ввода-вывода, он устанавливает приоритет ввода-вывода и «правильность» - аналогично тому, что
nice
делает для процесса приоритет процессора.Со страницы руководства:
источник
CFQ
планировщиком ввода-вывода. Во многих современных системахdeadline
одна из них включена по умолчанию.systemd предоставляет оболочку для вызовов процессов, управляемых cgroup. Со страницы руководства systemd-run (1):
Попробуйте использовать
--scope
опцию, чтобыsystemd-run
запустить программу на переднем плане.источник
Ответ fche - очень хороший совет , спасибо за это, хотя это не решило проблему, потому что вопрос заключался в том, чтобы ограничить процесс определенной полосой пропускания.
Я хотел бы предложить что-то вроде этого:
или устаревшая версия:
Тем не менее, этот вопрос не подходит, потому что его нельзя использовать для уже запущенного процесса, но, возможно, это полезно в некоторых других случаях.
Ссылки:
источник