Вступление
Контрольные группы, или 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 * и многое другое.
Проверьте следующие ресурсы для более подробной информации: