Я не могу заставить cgroup blkio ограничивать iops процессов в подгруппе. Я использую CentOS 7, 3.10.0-229. Я создаю cgroup /sys/fs/cgroup/blkio/user.slice/test1 и делаю
echo 8:32 10 > /sys/fs/cgroup/blkio/user.slice/test1/blkio.throttle.read_iops_device
и то же самое для write_iops_device. 8:32 соответствует жесткому диску в / dev / sdc. Затем я использую stress-ng для чтения и записи на диск в / srv / hdd-c, используя
cgexec -g blkio:user.slice/test1 stress-ng --temp-path /srv/hdd-c --hdd 15 -t 180
и
cgexec -g blkio:user.slice/test1 stress-ng --temp-path /srv/hdd-c --readahead 15 -t 180
Я подтвердил, что 30 запущенных процессов работают в контрольной группе blkio: user.slice / test1, используя ps eo pid,user,args,cgroup
.
Когда я делаю iostat 5
количество tps для sdc составляет от 400 до 600, что такое же, как когда я запускаю их вне контрольной группы test1. Я получу тот же результат, если сделаю echo 8:32 10 > /sys/fs/cgroup/blkio/user.slice/blkio.throttle.{read|write}_iops_device
и запустить их в user.slice
или user.slice/test1
cgroup. Однако, если я задушу корень blkio, используя echo 8:32 10 > /sys/fs/cgroup/blkio/blkio.throttle.{read|write}_iops_device
, а затем запустить процессы стресс-нг, iostat 5
показывает tps для SDC 10-11.
Троттлинг blkio работает только на корневом уровне? Страницы руководства, кажется, не предлагают этого.
Итак, вопрос, который я узнал из ответа на этот вопрос, заключается в том, что буферизация ядра обходит систему blkio. С помощью fio
без буферизации и directio я смог ограничить iops на устройство до 10 в секунду, используя echo 8:32 10 > /sys/fs/cgroup/blkio/user.slice/blkio.throttle.{read|write}_iops_device
Я получил тот же результат, что и вы, но обнаружил, что если бы я использовал
blkio.throttle. {читать | писать} _bps_device
это ограничит пропускную способность, когда устройство используется в качестве файловой системы.