Управление ресурсами при помощи cgroups в CentOS 6

Контрольные группы, или cgroups – это функция ядра CentOS 6, представляющая новый способ управления ресурсами системы. Вы можете создавать свои собственные cgroups, отслеживать их работу, запрещать им доступ к определенным ресурсам и даже динамически перенастраивать их в работающей системе.

В данном руководстве показано, как ограничить использование CPU, памяти и  i/o, включая создание новой контрольной группы и добавление в неё процессов.

Требования

Для выполнения инструкций нужен предварительно настроенный сервер CentOS 6 и учётная запись не-root пользователя с доступом к sudo. Обо всём этом можно прочесть в руководстве «Начальная настройка сервера CentOS 6».

Обратите внимание: все команды нужно запускать с sudo.

1: Установка зависимостей cgroups

Сначала нужно установить все пакеты, от которых зависит работа cgroups.

Контрольными группами и подсистемами, к которым они относятся, можно управлять с помощью команд и утилит оболочки. Однако для более удобной работы с группами рекомендуется установить пакет libcgroup. Этот пакет предоставляет специальные утилиты командной строки, файлы конфигураций и справочные страницы для использования cgroups. На сервере CentOS 6 этот пакет не устанавливается по умолчанию. Чтобы установить его, выполните следующую команду:

sudo yum install libcgroup

2: Запуск сервиса

Сервис cgconfig (control group config) используется для создания контрольных групп и управления подсистемами. Он может запускаться автоматически и восстанавливать созданные ранее cgroups. На CentOS 6 сервис cgconfig не запускается сам, потому его нужно запустить:

sudo service cgconfig start

При запуске сервис cgconfig создаёт виртуальную файловую систему, вмонтированную в /cgroup со всеми подсистемами. Проверьте, так ли это:

sudo ls /cgroup

Эта команда вернёт следующие подсистемы:

blkio  cpu  cpuacct  cpuset  devices  freezer  memory  net_cls

Также можно использовать команду lscgroup:

sudo lscgroup

Эта команда выводит те же подсистемы в другом формате:

cpuset:/
cpu:/
cpuacct:/
memory:/
devices:/
freezer:/
net_cls:/
blkio:/

Ресурсы системы

Системные ресурсы делятся на подсистемы. Каждая подсистема имеет несколько параметров, которым присваиваются различные значения. CentOS 6 предоставляет десять подсистем:

  • blkio – эта подсистема ограничивает ввод/вывод блочных устройств (физических дисков, твёрдотельных дисков, USB и т.д.).
  • cpu – эта подсистема устанавливает лимиты на доступное время процессора.
  • cpuacct – формирует автоматические отчеты об использовании ресурсов процессора и задачах в cgroup.
  • cpuset – присваивает задачам cgroup отдельные процессоры (в многоядерной системе) и узлы памяти.
  • devices – управляет доступом к устройствам.
  • freezer – приостанавливает или возобновляет выполнение задачи в контрольной группе.
  • memory – устанавливает ограничения на использование памяти и генерирует автоматические отчеты о ресурсах памяти, используемых определённой cgroup.
  • net_cls – ставит теги на сетевые пакеты, что позволяет контроллеру Linux traffic controller (tc) определить пакеты, исходящие от конкретной задачи контрольной группы.
  • net_prio – динамически устанавливает приоритет сетевого трафика.
  • ns – отвечает за создание именованных пространств.

3: Настройка cgroups

Теперь создайте тестовую cgroup и настройте ограничения ресурсов для неё. Конфигурационный файл cgroup находится в /etc/cgconfig.conf. В зависимости от содержимого этого файла cgconfig может создавать иерархии, монтировать файловые системы, создавать контрольные группы и задавать параметры подсистем (ограничения ресурсов) для каждой группы.

Иерархия групп – это набор контрольных групп, расположенных в виде дерева таким образом, что каждая задача в системе находится точно в одной cgroup в

иерархии. В стандартных конфигурациях CentOS 6 каждая подсистема выделена в отдельную иерархию.

Для начала создайте несколько cgroups по имени limitcpu, limitmem, limitio и browsers. Файл /etc/cgconfig.conf содержит два основных типа записей – mount и group. Записи, которые начинаются с group, создают cgroups и устанавливают параметры подсетей. Отредактируйте /etc/cgconfig.conf и добавьте в конец файла  следующие строки:

group limitcpu{
cpu {
cpu.shares = 400;
}
}
group limitmem{
memory {
memory.limit_in_bytes = 512m;
}
}
group limitio{
blkio {
blkio.throttle.read_bps_device = "252:0         2097152";
}
}
group browsers{
cpu {
cpu.shares = 200;
}
memory {
memory.limit_in_bytes = 128m;
}
}

  • Контрольная группа limitcpu ограничивает ресурсы cpu, доступные процессам в ней, до 400. Параметр cpu.shares определяет долю ресурсов CPU, доступных этой группе.
  • Группа limitmem ограничивает память до 512MB.
  • Группа limitio ограничивает пропускную способность диска до 2 МБ/с.
  • Группа browsers устанавливает долю вычислительных ресурсов cpu до 200 и память до 128M.

Перезапустите cgconfig, чтобы обновить настройки:

sudo service cgconfig restart

Теперь нужно настроить автозапуск сервиса cgconfig. Сервис, включенный при помощи chkconfig, будет читать конфигурационный файл cgroup (/etc/cgconfig.conf) во время загрузки. Таким образом cgroups восстанавливаются от сессии к сессии и работают постоянно.

sudo chkconfig cgconfig on

Убедитесь, что ранее настроенные cgroups корректно отображаются:

lscgroup

Если всё было выполнено правильно, на экране появится:

cpuset:/
cpu:/
cpu:/browsers
cpu:/limitcpu
cpuacct:/
memory:/
memory:/browsers
memory:/limitmem
devices:/
freezer:/
net_cls:/
blkio:/
blkio:/limitio

Теперь нужно добавить в группы процессы (задачи), для которых будут действительны настроенные ранее ограничения ресурсов.

Демон cgred (control group rules engine daemon) – это сервис, перемещающий задачи в cgroups согласно параметрам файла /etc/cgrules.conf. Записи в /etc/cgrules.conf могут выглядеть так:

user subsystems control_group

или так:

user:command subsystems control_group

Поле user задаёт имя пользователя или группы (с префиксом @ для группы); subsystems задаёт список подсистем через запятую; поле control_group определяет путь к cgroup; command задаёт имя процесса или полный путь к нему. Кроме того, записи в файле /etc/cgrules.conf могут содержать следующие дополнительные обозначения:

  • @ указывает на группу (вместо отдельного пользователя). Например, @admin указывает на всех пользователей группы admin, а не на конкретного пользователя с таким именем.
  • значит «всё/все». Например, символ * в поле user задаёт всех пользователей.
  • % представляет такой же элемент, как и в строке выше.

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

*:firefox       cpu,memory      browsers/
*:hdparm        blkio   limitio/
8host   blkio   limitio/
@admin:memhog  memory  limitmem/
*:cpuhog        cpu     limitcpu/

  • Процесс firefox, запущенный любым пользователем, будет добавлен в группу browsers, которая ограничит подсистемы cpu и memory.
  • Процессы hdparm, запущенные любым пользователем, будут добавлены в группу limitio, которая ограничивает подсистемы blkio согласно параметрам, заданным в конфигурациях cgroup. Все процессы, запущенные пользователем 8host, также будут добавлены в группу limitio.
  • Процессы memhog, запущенные любым пользователем группы admin, попадут в контрольную группу limitmem, которая ограничивает подсистему memory.
  • Процессы cpuhog, запущенные любым пользователем, будут добавлены в группу limitcpu и ограничены в подсистеме cpu.

Запустите сервис cgred, чтобы обновить настройки cgrules:

sudo service cgred start

Затем нужно убедиться, что cgred запускается автоматически вместе с системой:

sudo chkconfig cgred on

Примечание: Для сервисов, поддерживающих sysconfig, можно добавить переменную CGROUP_DAEMON=”subsystem:control_group” в /etc/sysconfig/servicename вместо того чтобы редактировать файл cgrules.conf. Например, для сервиса HTTPD можно просто добавить CGROUP_DAEMON=”blkio:/limitio” в файл /etc/sysconfig/httpd.conf, чтобы добавить процессы httpd в контрольную группу limitio.

4: Тестирование групп

Теперь нужно убедиться, что группы работают должным образом.

Чтобы проверить пропускную способность (которая не должна превышать 2 МБ/с), установите инструмент hdparm, который позволяет устанавливать и просматривать параметры жестких дисков, измерять скорость read и write, и многое другое. Чтобы установить hdparm, введите:

sudo yum install hdparm

Затем запустите команду, чтобы измерить скорость read диска /dev/vda:

sudo hdparm --direct -t /dev/vda

На экране появится следующий вывод:

/dev/vda:
Timing O_DIRECT disk reads:   6 MB in  3.00 seconds =   2.00 MB/sec

Этот результат показывает, что пропускная способность диска равна 2МБ/с. Остановите сервисы cgconfig и cgred, а затем снова запустите hdparm, и результат будет другим.

Заключение

К сожалению, это руководство охватывает только некоторые из основных функций контрольных групп.

Кроме того, можно также создавать субконтрольные группы (sub-cgroups), рассчитывать и мониторить количество ресурсов, потребляемых конкретной контрольной группой, приостанавливать группу процессов при помощи подсистемы freezer, и ещё многое и многое другое.

Tags: , , ,

Добавить комментарий