Управление системными ресурсами
Управление системными ресурсами в Red Hat Enterprise Linux 6
Редакция 1
Аннотация
Глава 1. Введение в контрольные группы
cgconfig можно обеспечить сохранение конфигурации cgroups между перезагрузками.
1.1. Организация контрольных групп
Модель процессов Linux
init, который запускается во время загрузки системы и запускает другие процессы. Таким образом, иерархия процессов Linux представляет собой дерево с единственным корнем.
init наследуют настройки окружения (переменную PATH и пр.) [1] и другие атрибуты родительского процесса (дескрипторы файлов и пр.).
Модель контрольных групп
- организованы в виде иерархии;
- дочерние группы выборочно наследуют атрибуты родительской группы.
Подсистемы в Red Hat Enterprise Linux
blkio: ограничение ввода-вывода блочных устройств (дисков, USB и т.п.).cpu: использует планировщик для управления доступом к процессору.cpuacct: генерирует отчеты об использовании процессорных ресурсов.cpuset: отвечает за выделение процессоров и узлов памяти в многопроцессорных системах .devices: отвечает за управление доступом заданий к устройствам.freezer: останавливает и возобновляет работу заданий контрольной группы.memory: накладывает ограничения и генерирует отчеты об использовании памяти.net_cls: позволяет присвоить сетевым пакетам идентификатор класса (classid), который помогает контроллеруtcидентифицировать пакеты, поступающие из заданной контрольной группы.ns: подсистема пространства имен.
Примечание
1.2. Связи между подсистемами, иерархиями, контрольными группами и задачами
Отдельная подсистема может быть сопоставлена только одной иерархии.
cpu не может быть одновременно подключена к двум разным иерархиям.
С одной иерархией может быть связано несколько подсистем.
cpu и memory могут быть подключены к одной и той же иерархии при условии, что ни одна из подсистем не связана с другой иерархией.
При создании новой иерархии все системные задачи по умолчанию будут назначены контрольной группе этой иерархии — так называемой корневой группе. Каждое задание в созданной иерархии может принадлежать только одной группе в этой иерархии. Задача может принадлежать различным группам, если они расположены в разных иерархиях. Поэтому как только задача входит в состав новой группы в этой же иерархии, она автоматически удаляется из исходной группы.
cpu и memory назначены иерархии cpu_and_mem, а подсистема net_cls — иерархии net, то процесс httpd может принадлежать одной группе в cpu_and_mem и одной в net.
cpu_and_mem, которой принадлежит процесс httpd, может сократить процессорное время, выделяемое другим процессам, до половины, а память — до 1024 МБ. Группа в net, в состав которой httpd также входит, может ограничить скорость передачи 30 мегабайтами в секунду.
Если процесс создает дочерние процессы, они автоматически войдут в состав групп, которым принадлежит родительский процесс. Впоследствии дочерние процессы можно перенести в другие группы.
httpd, входящий в состав группы half_cpu_1gb_max в иерархии cpu_and_mem и группы trans_rate_30 в иерархии net. Порождаемые им процессы будут автоматически принадлежать half_cpu_1gb_max и trans_rate_30.
1.3. Особенности работы с контрольными группами
- Так как задача может принадлежать лишь одной группе в иерархии, для ее управления будет использоваться всего одна подсистема.
- Несколько подсистем можно сгруппировать так, чтобы они контролировали все задачи в заданной иерархии. Так как настройки групп в этой иерархии могут отличаться, результаты могут отличаться.
- Структура иерархии может меняться. Например, может потребоваться исключить подсистему, к которой подключено несколько других подсистем, и добавить ее в другую иерархию.
- И наоборот, если необходимость в разделении подсистем отпала, можно удалить одну иерархию и добавить ее подсистемы в другую.
- Можно изменять параметры отдельных задач в иерархии, используя подсистему в качестве критерия выбора.
- Возможна и более тонкая настройка задач. Так, например, каждая задача может состоять в разных иерархиях, к каждой из которых подключена всего одна подсистема. В этом случае администратор сможет одновременно управлять всеми настройками процесса.
Глава 2. Работа с контрольными группами
Примечание
~]# yum install libcgroup2.1. Служба cgconfig
cgconfig устанавливается вместе с libcgroup и рекомендуется для создания иерархий, их связи с подсистемами и управления группами.
cgconfig не запускается по умолчанию. При ее запуске с помощью chkconfig будет прочитан файл конфигурации /etc/cgconfig.conf. Каждый раз при запуске группы будут создаваться заново и таким образом сохранять постоянство. Исходя из настроек в /etc/cgconfig.conf, cgconfig может создавать иерархии, подключать файловые системы, создавать контрольные группы и настраивать подсистемы для каждой группы.
/etc/cgconfig.conf определены настройки для создания и подключения иерархии для каждой подсистемы, и для связи подсистем с этими иерархиями.
cgconfig (команда service cgconfig stop) все иерархии будут отключены.
2.1.1. cgconfig.conf
cgconfig.conf содержит два типа записей — mount и group. В секции mount создаются иерархии, которые затем подключаются как виртуальные файловые системы. Созданным иерархиям могут быть назначены подсистемы. Формат:
mount {
<подсистема> = <путь>;
…
}
Пример 2.1. Создание секции mount
cpuset:
mount {
cpuset = /cgroup/cpu;
}
~]#mkdir /cgroup/cpu~]#mount -t cgroup -o cpu cpu /cgroup/cpu
group <имя> {
[<права>]
<подсистема> {
<параметр> = <значение>;
…
}
…
}
perm {
task {
uid = <пользователь>;
gid = <группа>;
}
admin {
uid = <администратор>;
gid = <админ_группа>;
}
}
Пример 2.2. Создание секции group
sqladmin разрешается добавлять задачи в группу, а пользователю root разрешается изменять параметры подсистем.
group daemons/sql {
perm {
task {
uid = root;
gid = sqladmin;
} admin {
uid = root;
gid = root;
}
} cpu {
cpu.shares = 100;
}
}
~]#mkdir -p /cgroup/cpu/daemons/sql~]#chown root:root /cgroup/cpu/daemons/sql/*~]#chown root:sqladmin /cgroup/cpu/daemons/sql/tasks~]#echo 100 > /cgroup/cpu/daemons/sql/cpu.shares
Примечание
/etc/cgconfig.conf вступили в силу, надо перезапустить cgconfig:
~]# service cgconfig restart
/etc/cgconfig.conf. Знаки # в начале строки отделяют комментарии, которые cgconfig будет игнорировать.
2.2. Создание иерархии и подключение подсистем
Предупреждение
cgconfig), приведенные здесь команды завершатся неудачей, так как для их работы необходимо отключить существующие иерархии, что повлияет на производительность системы. Не рекомендуется экспериментировать с этими настройками в критически важных системах.
mount в /etc/cgconfig.conf (в режиме root). Формат:
подсистема = /cgroup/иерархия;
cgconfig будет создана иерархия и подключены подсистемы.
cpu_and_mem, к которой будут подключены подсистемы cpu, cpuset, cpuacct, memory.
mount {
cpuset = /cgroup/cpu_and_mem;
cpu = /cgroup/cpu_and_mem;
cpuacct = /cgroup/cpu_and_mem;
memory = /cgroup/cpu_and_mem;
}Создание иерархии в оболочке
~]# mkdir /cgroup/имя~]# mkdir /cgroup/cpu_and_mem~]# mount -t cgroup -o подсистемы иерархия /cgroup/иерархияПример 2.3. Подключение подсистем с помощью mount
/cgroup/cpu_and_mem. К иерархии с именем cpu_and_mem будут подключены подсистемы cpu, cpuset и memory. Наконец, cpu_and_mem будет подключена в /cgroup/cpu_and_mem:
~]# mount -t cgroup -o cpu,cpuset,memory cpu_and_mem /cgroup/cpu_and_memlssubsys [3]:
~]# lssubsys -am
cpu,cpuset,memory /cgroup/cpu_and_mem
net_cls
ns
cpuacct
devices
freezer
blkio- иерархии
/cgroup/cpu_and_memназначены подсистемыcpu,cpuset,memory; - подсистемы
net_cls,ns,cpuacct,devices,freezerиblkioеще не принадлежат никаким иерархиям, о чем свидетельствует отсутствие соответствующих точек подключения.
2.3. Добавление и удаление подсистем из иерархии
mount в /etc/cgconfig.conf (см. Раздел 2.2, «Создание иерархии и подключение подсистем»). Изменения вступят в силу после перезапуска cgconfig.
Создание иерархии в оболочке
mount и указать параметр remount.
Пример 2.4. Отключение иерархии для добавления подсистемы
cpu_and_mem связаны подсистемы cpu, cpuset и memory.
~]# lssubsys -am
cpu,cpuset,memory /cgroup/cpu_and_mem
net_cls
ns
cpuacct
devices
freezer
blkiocpu_and_mem, указав параметр remount, и добавим cpuacct в список подсистем:
~]# mount -t cgroup -o remount,cpu,cpuset,cpuacct,memory cpu_and_mem /cgroup/cpu_and_memlssubsys теперь выглядит так:
~]# lssubsys -am
cpu,cpuacct,cpuset,memory /cgroup/cpu_and_mem
net_cls
ns
devices
freezer
blkiocpuacct:
~]# mount -t cgroup -o remount,cpu,cpuset,memory cpu_and_mem /cgroup/cpu_and_mem2.4. Отключение иерархии
umount:
~]# umount /cgroup/имя~]# umount /cgroup/cpu_and_memcgclear (см. Раздел 2.11, «Удаление контрольных групп»).
2.5. Создание контрольных групп
cgcreate -t uid:gid -a uid:gid -g подсистемы:путь.
-t(необязательный): определяет пользователя (по UID) и группу (по GID), которым будет принадлежать псевдофайлtasksсоздаваемой группы. Пользователь сможет добавлять и удалять задания из группы.Примечание
Единственный метод удаления задач из группы заключается в их перемещении в другую группу. При этом пользователь должен обладать правами записи во вторую группу.-a(необязательный): определяет пользователя (по UID) и группу (по GID), которым будут принадлежать все псевдофайлы группы кромеtasks. Этот пользователь сможет изменять уровень доступа заданий к ресурсам.-g(необзятельный): разделенный запятой список подсистем, определяющих иерархии, которым будет принадлежать группа. Список завершается двоеточием, после которого следует путь к группе. Точка подключения иерархии не указывается.К примеру, группа в/cgroup/cpu_and_mem/lab1/будет обозначена какlab1, так как ее путь уже известен в силу того, что заданной подсистеме соответствует всего одна иерархия. Группа контролируется всеми подсистемами в указанных иерархиях, даже если некоторые подсистемы не были напрямую перечислены в строкеcgcreate(см. Пример 2.5, «Пример cgcreate»).
Пример 2.5. Пример cgcreate
cpu и memory подключены в иерархию cpu_and_mem, а net_cls — в net.
~]# cgcreate -g cpu,net_cls:/test-subgroupcgcreate создаст две группы с именем test-subgroup — одну в иерархии cpu_and_mem, а вторую в net. Первая группа будет также находиться под контролем подсистемы memory, хотя это не указано явно.
Создание иерархии в оболочке
mkdir:
~]# mkdir /cgroup/иерархия/имя/новая_группа~]# mkdir /cgroup/cpuset/lab1/group12.6. Удаление контрольных групп
cgdelete подсистемы:путь.
- подсистемы — список подсистем, разделенных запятой;
- путь — путь к контрольной группе из текущей иерархии.
~]# cgdelete cpu,net_cls:/test-subgroup-r осуществляет рекурсивное удаление подгрупп.
2.7. Настройка параметров
cgset. К примеру, чтобы указать процессоры, к которым у группы должен быть доступ:
cpuset]# cgset -r cpuset.cpus=0-1 group1cgset -r параметр=значение путь.
- параметр — устанавливаемый параметр, которому соответствует файл в каталоге группы;
- значение — присвоенное параметру значение;
- путь — путь к группе из корня иерархии. Например, команда настройки параметра корневой группы
/cgroup/cpuacct/, будет выглядеть так:cpuacct]#
cgset -r cpuacct.usage=0 /Корневая группа также может быть обозначена как., то есть команда может выглядеть так:cpuacct]#
cgset -r cpuacct.usage=0 .Рекомендуется использовать первый вариант команды.Примечание
В корневой группе можно настроить лишь ограниченное число параметров (включая приведенный вышеcpuacct.usage). Это объясняется тем, что корневой группе принадлежат все ресурсы, поэтому изменение настроек на этом уровне ограничит все существующие процессы, что нецелесообразно.Чтобы изменить параметр вgroup1, которая входит в состав корневой группы:cpuacct]#
cgset -r cpuacct.usage=0 group1Добавление "/" после названия группы (cpuacct.usage=0 group1/) необязательно.
group1 доступен только процессор CPU 0, то group1/subgroup1 тоже будет доступен только этот процессор.
cgset можно копировать параметры одной группы в другую:
~]# cgset --copy-from group1/ group2/cgset --copy-from путь1 путь2.
- путь1 — путь к исходной контрольной группе;
- путь2 — путь к группе-получателю.
Создание иерархии в оболочке
echo. Ниже приведен пример добавления значения 0-1 в cpuset.cpus контрольной группы group1:
~]# echo 0-1 > /cgroup/cpuset/group1/cpuset.cpus2.8. Перенос процесса в контрольную группу
cgclassify:
~]# cgclassify -g cpu,memory:group1 1701cgclassify -g подсистемы:путь PID.
- подсистемы — список подсистем, разделенных запятой. Если указать
*, то будут выбраны все подсистемы, которым принадлежат указанные процессы. Если в разных иерархиях есть группы с одним и тем же именем,-gпереместит процессы в каждую группу. - путь — путь к группе из корня иерархии.
- PID — список идентификаторов процессов, разделенных запятой.
-- sticky перед идентификатором процесса оставляет дочерние процессы в текущей контрольной группе. Если аргумент не указан, и в то же время выполняется cgred, дочерние процессы будут переназначены в соответствии с настройками в /etc/cgrules.conf. Сам процесс будет оставаться в исходной контрольной группе.
cgclassify можно сразу переместить несколько процессов. Следующая команда переместит процессы с PID 1701 и 1138 в группу group1:
~]# cgclassify -g cpu,memory:group1 1701 1138Создание иерархии в оболочке
tasks этой группы. Команда переноса процесса 1701 в /cgroup/lab1/group1/ будет выглядеть так:
~]# echo 1701 > /cgroup/lab1/group1/tasks2.8.1. cgred
/etc/cgrules.conf параметров. Записи в /etc/cgrules.conf могут следовать следующим форматам:
- пользователь иерархии контрольная_группа
- пользователь:команда иерархии контрольная_группа
maria devices /usergroup/staff
maria, будут обращаться к подсистеме devices в соответствии с заданными для группы /usergroup/staff параметрами. Чтобы сопоставить отдельные команды контрольным группам, укажите их после имени пользователя:
maria:ftp devices /usergroup/staff/ftp
maria выполняет команду ftp, процесс будет автоматически перемещен в группу /usergroup/staff/ftp в иерархии, содержащей подсистему devices. Стоит отметить, что перенос процесса будет осуществлен только при выполнении указанного условия, поэтому может оказаться так, что ftp некоторое время будет выполняться не в той группе. Более того, если процесс создает другие процессы во время выполнения в другой группе, нет гарантии, что дочерние процессы будут корректно перемещены.
/etc/cgrules.conf могут включать дополнительные выражения:
@перед именем пользователя обозначает не отдельного пользователя, а группу. Например,@adminsвключает всех пользователей в группеadmins.*охватывает все компоненты. Так,*в поле подсистем обозначает все подсистемы.%копирует элементы из предыдущей строки. Например:@adminstaff devices /admingroup @labstaff % %
2.9. Запуск процесса в контрольной группе
Важно
cpuset, необходимо определить значения cpuset.cpus и cpuset.mems.
cgexec. Ниже будет запущен браузер lynx в пределах группы group1. Этот процесс унаследует ограничения доступа, определенные подсистемой cpu для этой группы:
~]# cgexec -g cpu:group1 lynx http://www.redhat.comcgexec -g подсистемы:путь команда аргументы.
- подсистемы — список подсистем, разделенных запятой. Если указать
*, будут выбраны все подсистемы, которым принадлежат указанные процессы. Если в разных иерархиях есть группы с одним и тем же именем,-gсоздаст процессы в каждой группе. - путь — путь к группе из корня иерархии.
- команда — выполняемая команда.
- аргументы — аргументы команды.
-- sticky перед командой оставляет дочерние процессы в текущей группе. Если аргумент не указан, и в то же время выполняется cgred, дочерние процессы будут переназначены в соответствии с настройками в /etc/cgrules.conf. Сам процесс будет оставаться в исходной контрольной группе.
Создание иерархии в оболочке
~]#echo $$ > /cgroup/lab1/group1/taskslynx
group1. Поэтому лучше предпочесть следующий метод:
~]# sh -c "echo \$$ > /cgroup/lab1/group1/tasks && lynx"2.9.1. Запуск службы в контрольной группе
- они должны использовать файл
/etc/sysconfig/имя_службы; - для запуска должны использовать функцию
daemon()из/etc/init.d/functions.
CGROUP_DAEMON="подсистема:группа" в ее файл /etc/sysconfig. Пример:
CGROUP_DAEMON="cpuset:daemons/sql"
2.10. Получение информации
2.10.1. Поиск процессов
~]$ ps -O cgroup~]$ cat /proc/PID/cgroup2.10.2. Поиск подсистем
~]$ cat /proc/cgroups~]$ lssubsys -m подсистемыlssubsys -m вернет только верхние точки подключения иерархий.
2.10.3. Поиск иерархий
/cgroup. Поэтому вывод содержимого этого каталога покажет список иерархий. Если в системе установлена программа tree, с ее помощью можно получить список иерархий и их групп:
~]$ tree /cgroup/2.10.4. Поиск контрольных групп
~]$ lscgroupподсистема:путь. Пример:
~]$ lscgroup cpuset:adminusersadminusers, принадлежащей иерархии, к которой подключена подсистема cpuset.
2.10.5. Просмотр параметров контрольных групп
~]$ cgget -r параметр группы~]$ cgget -r cpuset.cpus -r memory.limit_in_bytes lab1 lab2cpuset.cpus и memory.limit_in_bytes для групп lab1 и lab2.
~]$ cgget -g cpuset /2.11. Удаление контрольных групп
Предупреждение
cgclear. Если структура иерархии не сохранена в файле конфигурации, восстановить ее будет непросто.
cgclear можно полностью очистить файловую систему контрольных групп.
Примечание
mount, то в файлах /etc/mtab и /proc/mounts были созданы соответствующие записи. При удалении групп с помощью cgclear изменения будут отражены только в /proc/mounts. Файл /etc/mtab не будет изменен, поэтому результат выполнения команды mount будет содержать удаленные группы. Актуальный список групп можно найти в /proc/mounts.
2.12. Дополнительные ресурсы
Справочные страницы
man 1 cgclassify: с помощьюcgclassifyосуществляется перемещение выполняемых заданий между группами.man 1 cgclear: командаcgclearудаляет все группы в иерархии.man 5 cgconfig.conf: файлcgconfig.confсодержит определения групп.man 8 cgconfigparser: командаcgconfigparserосуществляет разбор файлаcgconfig.confи подключает иерархии в файловую систему.man 1 cgcreate: командаcgcreateсоздает группы в иерархиях.man 1 cgdelete: командаcgdeleteудаляет группы.man 1 cgexec: командаcgexecзапускает задания в группах.man 1 cgget: командаcggetпоказывает список параметров группы.man 5 cgred.conf: справочная страница файла конфигурации службыcgred.man 5 cgrules.conf: файлcgrules.confсодержит правила, помогающие определить принадлежность заданий группам.man 8 cgrulesengd: справочная страница службыcgrulesengd, которая распределяет задания между группами.man 1 cgset: справочная страница команды настройки контрольных групп.man 1 lscgroup: справочная страница команды просмотра групп в иерархии.man 1 lssubsys: справочная страница команды просмотра иерархий, содержащих заданные подсистемы.
Глава 3. Подсистемы и настраиваемые параметры
cgroups.txt в каталоге /usr/share/doc/kernel-doc-версия_ядра/Documentation/cgroups/. Последнюю версию документа можно найти на http://www.kernel.org/doc/Documentation/cgroups/cgroups.txt. Стоит помнить, что описание новых функций может не совпадать с установленным ядром.
cpuset.cpus определены процессоры, к которым разрешен доступ контрольной группы, а /cgroup/cpuset/webserver — контрольная группа веб-сервера, то команда
~]# echo 0,2 > /cgroup/cpuset/webserver/cpuset.cpus0,2 в cpuset.cpus, тем самым разрешив заданиям, PID которых перечислены в /cgroup/cpuset/webserver/tasks, использовать процессоры 0 и 2.
3.1. blkio
blkio (Block I/O) — подсистема управления вводом-выводом блочных устройств. Для ограничения доступа следует записать значения в соответствующие псевдофайлы, а их чтение позволяет получить интересующую информацию.
- blkio.weight
- Определяет относительный вес (от
100до1000) ввода-вывода контрольной группы. Для отдельных устройств это значение можно переопределить величинойblkio.weight_device. Пример присвоения значения500:echo 500 > blkio.weight - blkio.weight_device
- Определяет относительный вес (от
100до1000) ввода-вывода для конкретного устройства, доступного контрольной группе. Этот параметр переопределяетblkio.weight. Формат: старший_номер:младший_номер вес. Номера устройств определены в списке устройств Linux (см. http://www.kernel.org/doc/Documentation/devices.txt). Так, команда присвоения веса500для доступа к/dev/sdaвыглядит так:echo 8:0 500 > blkio.weight_deviceВ списке устройств Linux номера8:0соответствуют/dev/sda. - blkio.time
- Возвращает время доступа ввода-вывода к заданным устройствам. Каждая запись содержит старший_номер, младший_номер и время. Номера устройств определены в списке устройств Linux, а время указывается в миллисекундах.
- blkio.sectors
- Возвращает число перемещаемых между устройствами секторов. Запись содержит старший_номер, младший_номер и число_секторов. Номера устройств определены в списке устройств Linux.
- blkio.io_service_bytes
- Возвращает число байт, переносимых между устройствами. Запись содержит старший_номер, младший_номер, операция и число_байт. Номера устройств определены в списке устройств Linux, а операция может принимать значения
read,write,sync,async. - blkio.io_serviced
- Возвращает число операций ввода-вывода для указанных устройств. Запись содержит старший_номер, младший_номер, \nоперация и число_операций. Номера устройств определены в списке устройств Linux, а операция может принимать значения
read,write,sync,async. - blkio.io_service_time
- Возвращает время между выдачей запроса ввода-вывода и его завершением. Запись содержит старший_номер, младший_номер, операция и время. Номера устройств определены в списке устройств Linux, операция может принимать значения
read,write,sync,async, а время указывается в наносекундах. - blkio.io_wait_time
- Возвращает время ожидания операций ввода-вывода. Некоторые моменты следует отметить отдельно:
- Время ожидания может превышать общее время, так как суммируется время ожидания всех операций ввода-вывода для выбранной группы. Для определения времени ожидания группы используется
blkio.group_wait_time. - Если
queue_depth> 1, результат будет включать только время до отправки запроса устройству. Время ожидания переорганизации запросов устройством учитываться не будет.
Запись содержит поля старший_номер, младший_номер, операция и время. Номера устройств определены в списке устройств Linux, операция может принимать значенияread,write,sync,async, а время указывается в наносекундах. - blkio.io_merged
- Возвращает число запросов BIOS, объединенных с другими запросами ввода-вывода. Записи содержат поля число_запросов и операция. Параметр операция может принимать значения
read,write,sync,async. - blkio.io_queued
- Возвращает число запросов в очереди ввода-вывода группы. Записи содержат поля число_запросов и операция. Параметр операция может принимать значения
read,write,sync,async. - blkio.avg_queue_size
- Возвращает средний размер очереди ввода-вывода за время существования контрольной группы. Длина очереди проверяется каждый раз, когда группе предоставляется рабочее время. Эти данные будут доступны, только если определена переменная
CONFIG_DEBUG_BLK_CGROUP=y. - blkio.group_wait_time
- Возвращает общее время (в наносекундах), которое группа провела в ожидании времени обслуживания. Результат обновляется каждый раз, когда группе предоставляется рабочее время. Поэтому если группе было выделено время, после того как вы открыли файл для чтения, будет доступен лишь предыдущий результат. Данные будут доступны, только если определена переменная
CONFIG_DEBUG_BLK_CGROUP=y. - blkio.empty_time
- Возвращает общее время (в наносекундах), которое группа провела без ожидающих запросов. Результат обновляется каждый раз при появлении ожидающего запроса. Данные будут доступны, только если определена переменная
CONFIG_DEBUG_BLK_CGROUP=y. - blkio.idle_time
- Возвращает общее время (в наносекундах), которое планировщик провел в ожидании более подходящего запроса по сравнению с запросами в других очередях или из других групп. Результат обновляется каждый раз, когда группа выходит из состояния бездействия. Поэтому если открыть файл в период бездействия группы, информация о последнем состоянии бездействия будет недоступна. Данные будут доступны, только если определена переменная
CONFIG_DEBUG_BLK_CGROUP=y. - blkio.dequeue
- Сообщает, сколько раз запросы ввода-вывода удалялись устройствами из очереди. Запись содержит старший_номер, младший_номер и число_запросов. Номера устройств определены в списке устройств Linux. Эти данные будут доступны, только если определена переменная
CONFIG_DEBUG_BLK_CGROUP=y. - blkio.reset_stats
- Обнуляет статистику в других псевдофайлах.
3.2. cpu
cpu отвечает за управление доступом контрольных групп к процессорам. Доступ предоставляется в зависимости от перечисленных ниже параметров. Каждый параметр хранится в отдельном псевдофайле в виртуальной файловой системе контрольной группы:
- cpu.shares
- Целое значение, определяющее относительную величину доступного заданиям процессорного времени. Например, задания в двух контрольных группах, для которых
cpu.sharesимеет значение1, получат равное время доступа к процессорам, а задания в группе, для которойcpu.sharesимеет значение2, получат в два раза больше процессорного времени. - cpu.rt_runtime_us
- Определяет максимальный период времени (в микросекундах), в течение которого задания в контрольной группе могут использовать процессорные ресурсы. Такое ограничение позволяет предотвратить монопольное использование ресурсов одной контрольной группой. Например, если заданиям в контрольной группе необходимо предоставить периодический доступ длиной 4 секунды каждые 5 секунд, установите значение
cpu.rt_runtime_usв4000000, аcpu.rt_period_usв5000000. - cpu.rt_period_us
- Определяет интервал (в микросекундах), по истечении которого контрольная группа повторно получит доступ к процессорным ресурсам. Например, если заданиям в контрольной группе необходимо предоставить периодический доступ длиной 4 секунды каждые 5 секунд, установите значение
cpu.rt_runtime_usв4000000, аcpu.rt_period_usв5000000.
3.3. cpuacct
cpuacct создает отчеты о занятости процессорных ресурсов. Существует три типа отчетов:
- cpuacct.stat
- Возвращает число циклов процессора (в единицах, заданных с помощью
USER_HZ), затраченных на обработку заданий контрольной группы в пользовательском и системном режиме. - cpuacct.usage
- Возвращает суммарное время (в наносекундах), в течение которого процессорные ресурсы были заняты обработкой заданий контрольной группы (включая задания на низких уровнях иерархии).
- cpuacct.usage_percpu
- Возвращает время (в наносекундах), в течение которого ресурсы каждого процессора были заняты обработкой всех заданий контрольной группы (включая задания на низких уровнях иерархии).
3.4. cpuset
cpuset выделяет процессоры и узлы памяти контрольным группам. Ниже перечислены параметры cpuset. Каждый параметр хранится в отдельном псевдофайле в виртуальной файловой системе контрольной группы:
Важно
cpuset, необходимо определить значения cpuset.cpus и cpuset.mems.
- cpuset.cpus (обязательный)
- Определяет процессоры, к которым могут обращаться задания в группе. Представляет собой список значений ASCII, разделенных запятой. Для обозначения диапазона используется дефис. Пример:
0-2,16
Здесь перечислены процессоры 0, 1, 2 и 16. - cpuset.mems (обязательный)
- Определяет узлы памяти, к которым могут обращаться задания в группе. Представляет собой список значений ASCII, разделенных запятой. Для обозначения диапазона используется дефис. Пример:
0-2,16
Здесь перечислены узлы памяти 0, 1, 2 и 16. - cpuset.memory_migrate
- Флаг (
0или1), который вызывает перенос страницы памяти на другой узел при изменении значений вcpuset.mems. По умолчанию эта функциональность отключена (0) и страницы остаются на исходном узле, даже если узел не включен в список вcpuset.mems. Если же флаг установлен (1), страницы будут перенесены на узлы памяти, заданные вcpuset.mems. При этом по возможности будет поддерживаться их относительное размещение; так, например, страницы со второго узла в исходном списке будут перенесены на второй узел в обновленном спискеcpuset.mems. - cpuset.cpu_exclusive
- Флаг (
0или1), позволяющий совместно использовать назначенный заданному набору cpuset процессор другими cpuset. По умолчанию процессоры не ограничены одним набором cpuset (0). - cpuset.mem_exclusive
- Флаг (
0или1), позволяющий совместно использовать назначенные заданному набору cpuset узлы памяти другими cpuset. По умолчанию узлы памяти не ограничены одним набором cpuset (0). Их резервирование для одного набора cpuset (1) эквивалентно установке флагаcpuset.mem_hardwall. - cpuset.mem_hardwall
- Флаг (
0или1), позволяющий ограничить выделение страниц памяти и данных буфера узлами памяти, заданными в текущем наборе cpuset. По умолчанию (0) страницы и данные буфера могут совместно использоваться процессами, принадлежащими разным пользователям. Установка флага (1) отделяет выделение заданий для конкретного пользователя от других. - cpuset.memory_pressure
- Этот файл доступен только для чтения и содержит среднее значение нагрузки памяти в результате выполнения процессов, соответствующих текущему набору cpuset. Если флаг
cpuset.memory_pressure_enabledотключен (0), то значение в этом файле равно нулю, а при активацииcpuset.memory_pressure_enabledоно будет рассчитано автоматически. - cpuset.memory_pressure_enabled
- Флаг (
0или1), отвечающий за расчет нагрузки памяти, вызванной работой процессов в составе заданной контрольной группы. Значения рассчитываются умножением числа попыток возвращения занятой памяти в секунду на 1000 и характеризуют скорость освобождения процессами используемой памяти. Результаты сохраняются в файлcpuset.memory_pressure - cpuset.memory_spread_page
- Флаг (
0или1), позволяющий равномерно распределить буферы файловой системы между узлами памяти для заданного cpuset. По умолчанию распределение выполняться не будет (0), поэтому буферы будут помещаться на тот же узел, где выполняется создавший их процесс. - cpuset.memory_spread_slab
- Флаг (
0или1), отвечающий за равномерное распределение slab-блоков кэша для операций ввода-вывода в пределах текущего набора cpuset. По умолчанию распределение выполняться не будет (0), поэтому блоки кэша будут помещаться на тот же узел, где выполняется создавший их процесс. - cpuset.sched_load_balance
- Флаг (
0или1), отвечающий за распределение нагрузки между процессорами в составе заданного cpuset. По умолчанию (1) ядро распределяет нагрузку посредством переноса процессов на менее загруженные процессоры.Установка этого флага в контрольной группе не возымеет эффекта, если в родительской группе включено распределение нагрузки. Следует его отключить во всех родительских группах в иерархии, а также оценить, нужно ли распределение в контрольных группах на том же уровне иерархии. - cpuset.sched_relax_domain_level
- Содержит целое значение, начиная с
-1и заканчивая небольшим позитивным числом, определяющее диапазон процессоров, между которыми будет распределяться нагрузка. Не имеет эффекта, если отключен флагcpuset.sched_load_balance.В таблице перечислены типичные значения, хотя действия могут отличаться в зависимости от архитектуры.Значения cpuset.sched_relax_domain_levelЗначение Действие -1Использовать исходное системное значение для распределения нагрузки 0Не выполнять распределение нагрузки сразу, а делать это периодически 1Сразу перераспределить нагрузку между потоками одного ядра 2Сразу перераспределить нагрузку между ядрами одного пакета 3Сразу перераспределить нагрузку между процессорами на одном узле или blade-модуле 4Сразу перераспределить нагрузку между несколькими процессорами в системах с неоднородным доступом к памяти (NUMA) 5Сразу перераспределить нагрузку между всеми процессорами в системах с NUMA
3.5. devices
devices отвечает за управление доступом заданий контрольной группы к устройствам.
Важно
devices включена в Red Hat Enterprise Linux 6 в роли экспериментальной версии.
- devices.allow
- Задает устройства, к которым разрешен доступ заданий. Каждая запись содержит четыре поля: тип, старший_номер, младший_номер, доступ. Значения типа и номеров определены в списке устройств Linux (см.http://www.kernel.org/doc/Documentation/devices.txt).
- тип
- Допустимые значения типа:
aприменимо ко всем символьным и блочным устройствам;b— блочное устройство;c— символьное устройство.
- старший_номер, младший_номер
- Старший и младший номера разделены двоеточием и идентифицируют устройство Linux. Например,
8:1(где8— номер, соответствующий дискам SCSI, а1обозначает первый раздел на первом диске SCSI) соответствует разделу/dev/sda1."*" используется в качестве шаблона. Например,9:*обозначает устройства RAID, а*:*— все устройства. - доступ
- Допустимые значения:
rразрешает осуществлять чтение из заданного устройства;wразрешает осуществлять запись на заданные устройства;mразрешает создавать файлы устройств, если они не существуют.
К примеру, если задано значениеr, задания смогут выполнять чтение с заданного устройства, аrwразрешит и чтение, и запись.
- devices.deny
- Устройства, к которым запрещен доступ заданий. Формат записей аналогичен
devices.allow. - devices.list
- Возвращает устройства, для которых было настроено управление доступом заданий.
3.6. freezer
freezer отвечает за остановку и возобновление заданий контрольной группы.
- freezer.state
- Допустимые значения:
FROZEN: задания приостановлены;FREEZING: система в стадии приостановки заданий;THAWED: работа заданий возобновлена.
- Переместите процесс в группу в иерархии, к которой подключена подсистема
freezer. - Остановите работу этой группы, тем самым остановив работу процесса.
FROZEN и THAWED могут быть записаны в freezer.state, в то время как значение FREEZING изменить нельзя.
3.7. memory
memory создает отчеты об использовании ресурсов памяти и позволяет наложить ограничения с помощью следующих параметров:
- memory.stat
- Возвращает статистику памяти (см. таблицу).
Таблица 3.1. memory.stat
Значение Описание cacheкэш страниц (в байтах), включая tmpfs(shmem)rssанонимный кэш и кэш подкачки (в байтах) за исключением tmpfs(shmem)mapped_fileразмер файлов в карте памяти (в байтах), включая tmpfs(shmem)pgpginчисло страниц, помещаемых в память pgpgoutчисло страниц, извлекаемых из памяти swapиспользование пространства подкачки (в байтах) active_anonанонимный кэш и кэш подкачки (в байтах) в активном списке LRU (Least Recently Used) включая tmpfs(shmem)inactive_anonанонимный кэш и кэш подкачки (в байтах) в неактивном списке LRU (Least Recently Used) включая tmpfs(shmem)active_fileпамять с файловой поддержкой в активном списке LRU (в байтах) inactive_fileпамять с файловой поддержкой в неактивном списке LRU (в байтах) unevictableпамять, которую нельзя вернуть (в байтах) hierarchical_memory_limitлимит памяти для иерархии, содержащей контрольную группу memory(в байтах)hierarchical_memsw_limitсуммарный лимит памяти и пространства подкачки для иерархии, содержащей контрольную группу memory(в байтах)Перечисленным файлам за исключениемhierarchical_memory_limitиhierarchical_memsw_limitсоответствует файлtotal_с аналогичной информацией для всех дочерних групп. Так, еслиswapсообщает об использовании пространства подкачки группой, тоtotal_swap— о суммарном использовании пространства и группой, и ее подчиненными группами.Значения соотносятся следующим образом:active_anon+inactive_anon= (анонимная память) + (файловый кэш дляtmpfs) + (кэш подкачки).Как следствие,active_anon+inactive_anon≠rss, так какrssне включаетtmpfs.active_file+inactive_file= (размер кэшаtmpfs).
- memory.usage_in_bytes
- Суммарный размер памяти, занятой процессами заданной контрольной группы (в байтах).
- memory.memsw.usage_in_bytes
- Суммарный размер пространства подкачки, занятого процессами заданной контрольной группы (в байтах).
- memory.max_usage_in_bytes
- Максимальный размер памяти, занятой процессами заданной контрольной группы (в байтах).
- memory.memsw.max_usage_in_bytes
- Максимальный размер пространства подкачки, занятого процессами заданной контрольной группы (в байтах).
- memory.limit_in_bytes
- Задает максимальный размер памяти (включая файловый кэш). По умолчанию используются байты. Допускается использование приставок
kиKдля килобайтов,mиMдля мегабайтов,gиGдля гигабайтов.memory.limit_in_bytesнакладывает ограничения не на корневую группу, а на группы нижних уровней.Для отмены ограничений присвойте значение-1. - memory.memsw.limit_in_bytes
- Задает максимальный размер памяти и пространства подкачки. Если единицы не указаны, по умолчанию используются байты. Допускается использование приставок
kиKдля килобайтов,mиMдля мегабайтов,gиGдля гигабайтов.memory.memsw.limit_in_bytesнакладывает ограничения не на корневую группу, а на группы нижних уровней.Для отмены ограничений присвойте значение-1. - memory.failcnt
- Счетчик случаев достижения лимита, заданного в
memory.limit_in_bytes. - memory.memsw.failcnt
- Возвращает число случаев, когда лимит, заданный в
memory.memsw.limit_in_bytes, был достигнут. - memory.force_empty
- Если
0, память будет очищена от страниц, которые использовались заданиями контрольной группы. Если же память невозможно освободить, содержимое будет перенесено в родительскую группу. Прежде чем удалять группу, рекомендуется очистить память. - memory.swappiness
- Заставляет ядро осуществлять подкачку памяти, используемой заданиями контрольной группы, вместо возврата страниц из кэша страниц. Это аналогично поведению, определенному для всей системы в файле
/proc/sys/vm/swappiness. Значение по умолчанию —60. Значения меньше 60 уменьшают вероятность подкачки, а более высокие — увеличивают вероятность подкачки, а значения больше100приводят к подкачке страниц пространства адресов.0не отменяет подкачку полностью — в силу того глобальная логика управления виртуальной памятью не использует это значение, страницы будут подкачиваться при недостатке памяти. Чтобы запретить подкачку, рекомендуется использоватьmlock().Это поведение нельзя изменить для следующих групп:- для корневой группы, настройки которой определены в
/proc/sys/vm/swappiness, - для контрольной группы с существующими подчиненными группами.
- memory.use_hierarchy
- Флаг, отвечающий за возврат памяти.
1заставляет подсистемуmemoryосвободить память, используемую процессом, который превышает максимально разрешенную квоту, и его потомками. По умолчанию (0) память освобождаться не будет.
3.8. net_cls
net_cls присваивает сетевым пакетам идентификатор classid, который помогает контроллеру tc идентифицировать пакеты, поступающие из заданной контрольной группы. Настройки tc можно изменить так, чтобы пакетам из различных групп назначался разный приоритет.
- net_cls.classid
net_cls.classidсодержит шестнадцатеричное значение, идентифицирующее обработчик трафика. Например, значение10:1здесь будет представлено как0x1001.Формат:0xAAAABBBB, где AAAA — старший номер, а BBBB — младший. Нули в начале можно опустить, то есть значение1:1может быть записано как0x10001, что эквивалентно0x00010001.
net_cls назначает сетевым пакетам.
3.9. ns
ns позволяет сгруппировать процессы в отдельное пространство имен , где они могут взаимодействовать друг с другом, но будут изолированы от внешних процессов.
3.10. Дополнительные ресурсы
Документация
/usr/share/doc/kernel-doc-<версия_ядра>/Documentation/cgroups/, который создается при установке пакета kernel-doc.
blkio—blkio-controller.txtcpuacct—cpuacct.txtcpuset—cpusets.txtdevices—devices.txtfreezer—freezer-subsystem.txtmemory—memory.txt
Приложение A. История изменений
| История переиздания | ||||||
|---|---|---|---|---|---|---|
| Издание 1-2.400 | 2013-10-31 | |||||
| ||||||
| Издание 1-2 | 2012-07-18 | |||||
| ||||||
| Издание 1.0-5 | Thu May 19 2011 | |||||
| ||||||
| Издание 1.0-4 | Tue Mar 1 2011 | |||||
| ||||||
| Издание 1.0-3 | Wed Nov 17 2010 | |||||
| ||||||
| Издание 1.0-2 | Thu Nov 11 2010 | |||||
| ||||||
| Издание 1.0-1 | Wed Nov 10 2010 | |||||
| ||||||
| Издание 1.0-0 | Tue Nov 9 2010 | |||||
| ||||||
