Глава 3. Подсистемы и настраиваемые параметры

Подсистемы представляют собой модули ядра, отвечающие за выделение системных ресурсов контрольным группам. Можно отдельно запрограммировать подсистемы с целью создания индивидуального подхода к управлению группами процессов. Интерфейс программирования приложений (API, Application Programming Interface) для разработки новых подсистем задокументирован в файле 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.cpus
запишет 0,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
Обнуляет статистику в других псевдофайлах.