Начну в порядке от самой простой реализации до самой сложной.
Solaris
В 11.4 появился механизм ограничения операций I/O, которые доступны как свойства ZFS (аналогов в OpenZFS нет):
- writelimit – максимальное количество байт за секунду которые может записать dataset
- readlimit – максимальное количество байт за секунду которые может прочитать dataset
- defaultwritelimit – максимальное количество байт за секунду которые могут записать потомки dataset’a
- defaultreadlimit – максимальное количество байт за секунду которые могут прочитать потомки dataset’a
- effectivewritelimit – отчёт о том, какое максимальное количество байт за секунду которые может записать dataset
- effectivereadlimit – отчёт о том, какое максимальное количество байт за секунду которые может прочитать dataset
Минимальное возможное значение – 500К. Это не гарантированная пропускная способность, а лишь верхняя граница. В реальности скорость может быть ниже
FreeBSD
Это можно сделать через rctl, который появился в 9.0, но сами ресурсы управления I/O добавились лишь в 11.0
# rctl
rctl: RACCT/RCTL present, but disabled; enable using kern.racct.enable=1 tunable
Тут доступны такие “ресурсы”
- writebps – максимальное количество байт за секунду которые может записать файловая система
- readbps – максимальное количество байт за секунду которые может прочитать dataset
- writeiops – максимальное количество операций за секунду которые может записать файловая система
- readiops – максимальное количество операций за секунду которые может прочитать файловая система
Linux
Самый простой вариант – использовать утилиту ionice. Но она не всегда удобна: нужно переписывать скрипты и везде вставлять её.
Правильный и сложный вариант – использовать cgroup и механизм blkio controller. Но в нём очень много возможностей: от приоритетов I/O до количества секторов.