Рабочий пример ограничения блочного ввода-вывода посредством CGROUPS.
Время от времени, в работе возникает необходимость запустить процедуру в ходе выполнения которой возникает существенная нагрузка на дисковую подсистему. Примеры могут быть разными, копирование раздела, обработка большого количества файлов, синхронизация каталогов и т.д. Особенно плохо когда система и так уже достаточно нагружена. Становится необходимым снизить влияние возникшей нагрузки на основные задачи выполняемые сервером, т.к. возникшая нагрузка будет мешать работе основной задачи. Как вариант, можно использовать ionice, запустить задачу с пониженным приоритетом. Но есть другой, более гибкий и интересный вариант - использовать CGROUPS.В подсистеме CGROUPS есть реализация которая позволяет ограничивать блочный ввод-вывод, это контроллер blkio. В контроллере на момент написания статьи существует два типа лимитирования. Первое, это пропорциональное ограничение основанное на использовании механизмов планировщика CFQ. И второй способ ограничение на уровне выставления прямых границ по пропускной способности или по числу операций ввода-вывода (IOPS).
Таким образом в случае CGROUPS есть гибкий и более прозрачный механизм ограничения ввода вывода для блочных устройств, чем предлагаемый ionice.
Рассмотрим реальный пример применения, в котором применим ограничения для процесса копирования раздела выполняемом через dd;
Как правило во всех современных дистрибутивах поддержка CGROUPS уже реализована. Ядро должно быть собрано со следующими опциями. При наличии /proc/config.gz их наличие можно посмотреть там.
CONFIG_BLK_CGROUP=y
CONFIG_CFQ_GROUP_IOSCHED=y
CONFIG_BLK_DEV_THROTTLING=y
Если ядро поддерживает CGROUPS можно переходить к настройке. Все действия сводятся к простому алгоритму:
- монтируем виртуальную файловую систему CGROUPS;
- монтируем виртуальную файловую систему для работы к blkio контроллером;
- создаем группу с произвольным именем (в нашем случае ddtransfer);
- определяем ограничения для группы;
- запускаем процесс и помещаем его в группу.
# mount -t tmpfs cgroup_root /sys/fs/cgroup
# mkdir /sys/fs/cgroup/blkio
# mount -t cgroup -o blkio none /sys/fs/cgroup/blkio
Создаем каталог который будет сопоставляться с группой
# mkdir /sys/fs/cgroup/blkio/ddtransfer
Далее находим блочное устройство которое будем ограничивать по IO. Нам понадобятся major и minor номера этого устройства. В примере будет выполняться копирование одного раздела LVM средствами dd.
# lsblk |grep ddtest
└─sprint-ddtest (dm-8) 252:8 0 10G 0 lvm
Задаем ограничения путем записи номер устройства и лимита в управляющие файлы группы. Ограничиваем как чтение так и запись на уровне 1MB/s.
# echo '252:8 1048576' > /sys/fs/cgroup/blkio/ddtransfer/blkio.throttle.read_bps_device
# echo '252:8 1048576' > /sys/fs/cgroup/blkio/ddtransfer/blkio.throttle.write_bps_device
Теперь когда все готово, запускаем операцию копирования и помещаем pid процесса в tasks-файл созданной группы.
# dd if=/dev/vg00/root of=/dev/sprint/ddtest &
[1] 25636
# echo 25636 > /sys/fs/cgroup/blkio/ddtransfer/tasks
Вот и все. Таким образом мы сначала создали группу с ограничением ввода-вывода на определенном устройстве и затем поместили в эту группу процесс.
Выглядит это так.
На главную "Virtualizing Linux"
Комментариев нет:
Отправить комментарий