Страницы

Сохранить статью у себя в соцсети:

четверг, 7 февраля 2013 г.

§ CGROUPS: Block IO throttling.

Рабочий пример ограничения блочного ввода-вывода посредством 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);
  • определяем ограничения для группы;
  • запускаем процесс и помещаем его в группу.
Итак сначала монтируем файловые системы, если они не смонтированы (многие дистрибутивы монтируют их по умолчанию, смотрите вывод 'grep cgroup /proc/mounts')
# 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"

Комментариев нет:

Отправить комментарий

Популярные сообщения

Профиль в Google+ Яндекс цитирования Яндекс.Метрика