Как ограничить ресурсы с помощью cgroups на CentOS 6

Вступление

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

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

Предпосылки

Прежде чем вы начнете изучать этот учебник, у вас должен быть пользователь без полномочий root с настройкой sudo на вашем CentOS 6 Droplet. Чтобы настроить пользователя этого типа, следуйте нашему учебному руководству Initial Server Setup с CentOS 6. Все команды будут выполняться от имени этого пользователя.

Шаг 1 - Установка

В этом разделе мы будем устанавливать пакеты, необходимые для работы cgroups.

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

sudo yum install libcgroup

Шаг 2 - Запуск службы

Сервис + cgconfig + (настройка группы управления) используется для создания cgroups и управления подсистемами. Он может быть настроен для запуска во время загрузки и восстановления предварительно определенных групп, что делает их постоянными при перезагрузках. Служба + cgconfig + не запускается по умолчанию в CentOS 6, поэтому давайте запустим ее:

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 предоставляет десять подсистем cgroup:

  • * blkio * - эта подсистема устанавливает ограничения на доступ ввода / вывода к блочным устройствам и от них, таким как физические диски (диски, твердотельные накопители, USB и т. д.).

  • * процессор * - эта подсистема устанавливает ограничения на доступное время процессора

  • * cpuacct * - эта подсистема генерирует автоматические отчеты о ресурсах процессора, используемых задачами в cgroup

  • * cpuset * - эта подсистема назначает отдельные процессоры (в многоядерной системе) и узлы памяти задачам в группе

  • * devices * - эта подсистема разрешает или запрещает доступ к устройствам по задачам в cgroup

  • * freezer * - эта подсистема приостанавливает или возобновляет задачи в cgroup

  • * memory * - эта подсистема устанавливает ограничения на использование памяти задачами в cgroup и генерирует автоматические отчеты о ресурсах памяти, используемых этими задачами

  • * net_cls * - эта подсистема помечает сетевые пакеты идентификатором класса (classid), который позволяет контроллеру трафика Linux (tc) идентифицировать пакеты, исходящие из конкретной задачи cgroup

  • * net_prio * - эта подсистема предоставляет способ динамически устанавливать приоритет сетевого трафика для сетевого интерфейса

  • * ns * - это подсистема пространства имен

Шаг 3 - Конфигурация

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

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

Давайте сначала создадим несколько групп с именами limitcpu, limitmem, limitio и browser. Файл + / etc / cgconfig.conf содержит два основных типа записей -` + mount` и + group +. Строки, начинающиеся с + group +, создают cgroups и устанавливают параметры подсистемы. Отредактируйте файл + / etc / cgconfig.conf + и добавьте следующие записи cgroup внизу:

/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 + мы ограничиваем общие ресурсы процессора, доступные процессам в этой группе, до 400. + cpu.shares + указывает относительную долю процессорного времени, доступную для задач в cgroup.

  • В cgroup + limitmem + мы ограничиваем объем памяти, доступный процессам cgroup, до 512 МБ.

  • В группе + limitio + мы ограничиваем пропускную способность чтения диска до 2 МБ / с. Здесь мы ограничиваем число операций ввода-вывода для чтения первичным диском / dev / vda с основным: младшее число 252: 0, а 2 МБ / с преобразуется в байты в секунду (2x1024x1024 = 2097152).

  • В группе + browsers + мы ограничиваем общие ресурсы процессора до 200, а доступную память - до 128 МБ.

Нам нужно перезапустить сервис + cgconfig +, чтобы изменения в файле + / etc / cgconfig.conf + вступили в силу:

sudo service cgconfig restart

Давайте включим + cgconfig + для запуска при загрузке системы. Когда вы включаете сервис с помощью chkconfig, он читает файл конфигурации cgroup + / etc / cgconfig.conf + во время загрузки. cgroups воссоздаются из сеанса в сеанс и остаются постоянными.

sudo chkconfig cgconfig on

Затем убедитесь, что настроенные нами группы правильно отображаются:

lscgroup

Если все прошло хорошо, вы должны увидеть:

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

Наша следующая цель - добавить процессы (задачи), для которых мы хотим ограничить ресурсы, в созданные нами группы.

+ Cgred + (демон механизма управления правилами группы) - это служба, которая перемещает задачи в cgroups в соответствии с параметрами, установленными в файле + / etc / cgrules.conf +. Записи в файле + / etc / cgrules.conf могут принимать одну из двух форм:

user subsystems control_group

or

user:command subsystems control_group

«+ пользователь » относится к имени пользователя или имени группы с префиксом «@». ` subsystems ` относится к разделенному запятыми списку имен подсистем. ` control_group ` представляет путь к cgroup, а ` command ` обозначает имя процесса или полный командный путь процесса. Записи в файле ` / etc / cgrules.conf +` могут содержать следующие дополнительные обозначения:

  • + @ + - обозначает группу вместо отдельного пользователя. Например, + @ admin + указывает всех пользователей в группе администраторов.

  • + * + - представляет «все». Например, + * + в поле пользователя представляет всех пользователей.

  • +% + - представляет элемент такой же, как элемент в строке выше.

Теперь давайте добавим программы / процессы, которые мы хотим ограничить. Отредактируйте + / etc / cgrules.conf + и добавьте следующее внизу:

/etc/cgrules.conf

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

В приведенных выше строках мы устанавливаем следующие правила:

  • * процессы firefox *, запускаемые любым пользователем, будут автоматически добавлены в группу + browsers + и ограничены в подсистемах процессора и памяти.

  • * hdparm * процессы, выполняемые любым пользователем, будут добавлены в группу + limitio + и будут ограничены в подсистеме blkio в соответствии со значениями параметров, указанными в этой группе.

  • Все процессы, запускаемые пользователем * sammy *, будут добавлены в группу + limitio + и ограничены в подсистеме blkio.

  • Процессы * memhog *, выполняемые кем-либо из группы + admin +, будут добавлены в cgroup + limitmem + и ограничены в подсистеме памяти.

  • Процессы * cpuhog *, запускаемые любым пользователем, будут добавлены в cgroup + limitcpu + и ограничены в подсистеме cpu.

Нам нужно запустить сервис + cgred +, чтобы изменения конфигурации cgrules вступили в силу, сделайте это с помощью команды:

sudo service cgred start

Мы также должны убедиться, что служба + cgred + включена для запуска при загрузке системы, чтобы наши правила сохранялись при перезагрузках:

sudo chkconfig cgred on

Шаг 4 - Тестирование

На этом шаге мы проверим, что ограничение пропускной способности чтения диска в 2 МБ / с выполняется правильно в соответствии с правилом, которое мы добавили в + cgrules.conf +. Для этого мы установим и запустим инструмент + hdparm +. Инструмент + hdparm + может устанавливать и просматривать аппаратные параметры жестких дисков, измерять скорости чтения и записи и т. Д. Давайте установим hdparm используя:

sudo yum install hdparm

Теперь давайте запустим команду для измерения скорости чтения вашего жесткого диска / 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 +, указанную выше, вы увидите исходную / стандартную скорость чтения, когда правила cgroup не были реализованы.

Заключение

Этот учебник знакомит только с некоторыми основными вещами, которые вы можете сделать с cgroups. Также можно создавать подгруппы, подсчитывать и сообщать количество ресурсов, потребляемых группой, приостанавливать группу процессов с помощью подсистемы * freezer * и многое другое.

Проверьте следующие ресурсы для более подробной информации:

Related