Назад | Перейти на главную страницу

Я не могу заставить cgroup blkio регулировать iops процессов в подгруппе

Я не могу заставить 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

это ограничит пропускную способность, когда устройство используется в качестве файловой системы.