- cgroups
- Contents
- Installing
- With systemd
- Hierarchy
- Find cgroup of a process
- cgroup resource usage
- Custom cgroups
- As service
- Service unit file
- Grouping unit under a slice
- As root
- As unprivileged user
- Controller types
- User delegation
- User-defined slices
- Run-time adjustment
- With libcgroup
- Ad-hoc groups
- Persistent group configuration
- With the cgroup virtual filesystem
- Examples
- Matlab
- With systemd
- With libcgroup
- Documentation
- Tips and tricks
- Enable cgroup v1
- linux-notes.org
- Установка cgroups в Unix/Linux
- Установка cgroups в CentOS/RedHat
- Установка cgroups в Gentoo
- Установка cgroups в Fedora
- Установка cgroups в Debian/Ubuntu
- Настройка cgroups в Unix/Linux
- Использование, тестирование cgroups в Unix/Linux
- Создание cgroups в Unix/Linux
- One thought on “ Установка cgroups в Unix/Linux ”
- Добавить комментарий Отменить ответ
cgroups
Control groups (or cgroups as they are commonly known) are a feature provided by the Linux kernel to manage, restrict, and audit groups of processes. Compared to other approaches like the nice(1) command or /etc/security/limits.conf , cgroups are more flexible as they can operate on (sub)sets of processes (possibly with different system users).
Control groups can be accessed with various tools:
- using directives in systemd unit files to specify limits for services and slices;
- by accessing the cgroup filesystem directly;
- via tools like cgcreate , cgexec and cgclassify (part of the libcgroupAUR and libcgroup-gitAUR packages);
- using the «rules engine daemon» to automatically move certain users/groups/commands to groups ( /etc/cgrules.conf and /usr/lib/systemd/system/cgconfig.service ) (part of the libcgroupAUR and libcgroup-gitAUR packages); and
- through other software such as Linux Containers (LXC) virtualization.
cgmanager is deprecated and unsupported as it does not work with systemd versions 232 and above.
For Arch Linux, systemd is the preferred and easiest method of invoking and configuring cgroups as it is a part of the default installation.
Contents
Installing
Make sure you have one of these packages installed for automated cgroup handling:
- systemd — for controlling resources of a systemd service.
- libcgroupAUR , libcgroup-gitAUR — set of standalone tools ( cgcreate , cgclassify , persistence via cgconfig.conf ).
With systemd
Hierarchy
Current cgroup hierarchy can be seen with systemctl status or systemd-cgls command.
Find cgroup of a process
The cgroup name of a process can be found in /proc/PID/cgroup .
For example, the cgroup of the shell:
cgroup resource usage
The systemd-cgtop command can be used to see the resource usage:
Custom cgroups
systemd.slice(5) systemd unit files can be used to define a custom cgroup configuration. They must be placed in a systemd directory, such as /etc/systemd/system/ . The resource control options that can be assigned are documented in systemd.resource-control(5) .
This is an example slice unit that only allows 30% of one CPU to be used:
Remember to run systemctl daemon-reload to pick up any new or changed .slice files.
As service
Service unit file
Resources can be directly specified in service definition or as a Systemd#Drop-in files
Grouping unit under a slice
Service can be specified what slice to run in:
As root
systemd-run can be used to run a command in a specific slice.
—uid=username option can be used to spawn the command as specific user.
The —shell option can be used to spawn a command shell inside the slice.
As unprivileged user
Unprivileged users can divide the resources provided to them into new cgroups, if some conditions are met.
Cgroups v2 must be utilized for a non-root user to be allowed managing cgroup resources.
Controller types
Not all resources can be controlled by user.
Controller | Can be controlled by user | Options |
---|---|---|
cpu | Requires delegation | CPUAccounting, CPUWeight, CPUQuota, AllowedCPUs, AllowedMemoryNodes |
io | Requires delegation | IOWeight, IOReadBandwidthMax, IOWriteBandwidthMax, IODeviceLatencyTargetSec |
memory | Yes | MemoryLow, MemoryHigh, MemoryMax, MemorySwapMax |
pids | Yes | TasksMax |
rdma | No | ? |
eBPF | No | IPAddressDeny, DeviceAllow, DevicePolicy |
User delegation
For user to control cpu and io resources, the resources need to be delegated. This can be done by creating a unit overload.
For example if your user id is 1000:
Reboot and verify that the slice your user session is under has cpu and io controller:
User-defined slices
The user slice files can be placed in
To run the command under certain slice:
You can also run your login shell inside the slice:
Run-time adjustment
cgroups resources can be adjusted at run-time using systemctl set-property command. Option syntax is the same as in systemd.resource-control(5) .
For example, cutting off internet access for all user sessions:
With libcgroup
You can enable the cgconfig service with systemd. This allows you to track any errors in cgconfig.conf more easily.
Ad-hoc groups
One of the powers of cgroups is that you can create «ad-hoc» groups on the fly. You can even grant the privileges to create custom groups to regular users. groupname is the cgroup name:
Now all the tunables in the group groupname are writable by your user:
Cgroups are hierarchical, so you can create as many subgroups as you like. If a normal user wants to run a bash shell under a new subgroup called foo :
To make sure (only meaningful for legacy (v1) cgroups):
A new subdirectory was created for this group. To limit the memory usage of all processes in this group to 10 MB, run the following:
Note that the memory limit applies to RAM use only — once tasks hit this limit, they will begin to swap. But it won’t affect the performance of other processes significantly.
Similarly you can change the CPU priority («shares») of this group. By default all groups have 1024 shares. A group with 100 shares will get a
10% portion of the CPU time:
You can find more tunables or statistics by listing the cgroup directory.
You can also change the cgroup of already running processes. To move all ‘bash’ commands to this group:
Persistent group configuration
If you want your cgroups to be created at boot, you can define them in /etc/cgconfig.conf instead. For example, the «groupname» has a permission for $USER and users of group $GROUP to manage limits and add tasks. A subgroup «groupname/foo» group definitions would look like this:
This is equivalent to these shell commands:
With the cgroup virtual filesystem
This article or section needs expansion.
Starting with systemd 232, the cgm method described in the next section, this section will instead describe a manual method to limit memory usage.
Create a new cgroup named groupname:
Example: set the maximum memory limit to 100MB:
Move a process to the cgroup (note: only one PID can be written at a time, repeat this for each process that must be moved):
Examples
Matlab
Doing large calculations in MATLAB can crash your system, because Matlab does not have any protection against taking all your machine’s memory or CPU. The following examples show a cgroup that constrains Matlab to first 6 CPU cores and 5 GB of memory.
With systemd
Launch Matlab like this (be sure to use the right path):
With libcgroup
Change username to the user Matlab is run as.
You can also restrict the CPU share with the cpu constraint.
Launch Matlab like this (be sure to use the right path):
Documentation
- For information on controllers and what certain switches and tunables mean, refer to kernel’s documentation v1 or v2 (or install linux-docs and see /usr/src/linux/Documentation/cgroup )
- A detailed and complete Resource Management Guide can be found in the fedora project documentation.
For commands and configuration files, see relevant man pages, e.g. man cgcreate or man cgrules.conf
Tips and tricks
Enable cgroup v1
Cgroup v2 is now enabled by default. If you want to switch to cgroup v1 instead, you need to set the following kernel parameter:
Источник
linux-notes.org
cgroups (англ. control group) — механизм ядра Linux, который ограничивает и изолирует вычислительные ресурсы (процессорные, сетевые, ресурсы памяти, ресурсы ввода-вывода) для групп процессов. Механизм позволяет образовывать иерархические группы процессов с заданными ресурсными свойствами и обеспечивает программное управление ими.
Вы можете использовать CGroups для ограничения количества ресурсов, которые может потреблять процесс или группа.
Архитектура cgroups
Механизм cgroups состоит из двух составных частей: ядра (cgroup core) и так называемых подсистем.
- net_cls — помечает сетевые пакеты специальным тэгом, что позволяет идентифицировать пакеты, порождаемые определённой задачей в рамках контрольной группы;
- devices — разрешает или блокирует доступ к устройствам;
- blkio — устанавливает лимиты на чтение и запись с блочных устройств;
- pids — используется для ограничения количества процессов в рамках контрольной группы.
- cpu — обеспечивает доступ процессов в рамках контрольной группы к CPU;
- hugetlb — активирует поддержку больших страниц памяти для контрольных групп;
- cpuacct — генерирует отчёты об использовании ресурсов процессора;
- freezer — приостанавливает и возобновляет выполнение задач в рамках контрольной группы
- cpuset — распределяет задачи в рамках контрольной группы между процессорными ядрами;
- memory — управляет выделением памяти для групп процессов;
- netprio — используется для динамической установки приоритетов по трафику;
Установка cgroups в Unix/Linux
Данная тема охватит несколько ОС с наглядными примерами.
Установка cgroups в CentOS/RedHat
Данные управляющие группы и подсистемы ( к которым они относятся), могут управляться с помощью shell команд и утилит. Однако самый простой способ работы с такими группами — установить пакет libcgroup. Чтобы установить его, выполните следующую команду:
Служба cgconfig (конфигурация группы управления) используется для создания групп и управления подсистемами. Данный сервис может быть настроен для запуска во время загрузки и восстановления предустановленных групп, что делает их постоянными при перезагрузках. Чтобы запустить cgconfig службы, выполните:
Для проверки статуса, можно выполнить:
Чтобы добавить службу в автозагрузку ОС, выполните:
Установка cgroups в Gentoo
Команда для установки:
Установка cgroups в Fedora
Команда для установки:
Установка cgroups в Debian/Ubuntu
Не было необходимости еще!
Настройка cgroups в Unix/Linux
Документация ядра предоставляет общее описание с примерами. Но я в своей статье «Установка cgroups в Unix/Linux» опишу все возможные примеры максимально подробно.
Пакет cgroups-bin (который зависит от libcgroup1), уже предоставленный дистрибутивом. Настройка выполняется путем редактирования следующих двух файлов:
- /etc/cgconfig.conf — В зависимости от содержимого файла конфигурации cgconfig может создавать иерархии, монтировать необходимые файловые системы, создавать группы и устанавливать параметры подсистемы (ограничения ресурсов) для каждой группы. Иерархия представляет собой набор групп, расположенных в дереве, так что каждая задача в системе находится в одной из групп в иерархии.
- /etc/cgrules.conf — Служит для добавления ограничений для пользователей, групп, процессов.
Менеджер рабочей нагрузки (cgconfig) отвечает за распределение ресурсов.
Добавление нового процесса в менеджер можно следующим образом:
Добавление уже запущенного процесса в менеджер:
Или, можно использовать автоматический режим при работе с файлом cgrules.conf и CGroup Rules Daemon (cgred), который заставляет каждый вновь созданный процесс использовать ограничение по группе (но об этом позже).
И так, начнем редактирование:
Вот пример моего:
Можно этот файл использовать а можно создать новый файл в /etc/cgconfig.d директории, например:
- В группе limitcpu ограничиваем общие ресурсы cpu доступными для процессов в этой группе до 400. cpu.shares указывает относительную долю времени процессора, доступного для задач в cgroup.
- В группе limitmem ограничиваем доступную памяти cgroup процессам до 512 МБ.
- В limitio группе ограничиваем пропускную способность диска до 2 Мбайт/с. Здесь ограничиваем чтение ввода-вывода на основной диск, /dev/vda, с основным: младший номер 11:0 и 2MiB/s преобразуется в байты в секунду (2x1024x1024 = 2097152).
- В browsers группе ограничиваем общие ресурсы процессора до 200 и доступную память до 128 МБ.
Затем убедитесь, что настроенные группы отображаются правильно:
Наша следующая цель — добавить процессы (задачи), для которых мы хотим ограничить ресурсы для ранее созданных групп. Cgred (механизм управления группами) — это служба, которая перемещает задачи в группы в соответствии с параметрами, заданными в файле /etc/cgrules.conf. Записи в файле /etc/cgrules.conf могут принимать одну из двух форм:
user ссылается на имя пользователя или имя группы с префиксом «@». Подсистемы (subsystems) относятся к списку подсистем, которые разделенному запятыми. control_group представляет собой путь к cgroup, а команда обозначает имя процесса или полный путь к процессу процесса. Записи в файле /etc/cgrules.conf могут содержать следующие дополнительные обозначения:
- @ — Указывает группу вместо отдельного пользователя. Например, @admin указывает всех пользователей в admin группе.
- * — Использовать «все\всех». Например, если установить * в user поле, то это будет говорить, что будут использоватся все пользователи в ОС.
- % — Представляет элемент тот же, что и элемент в строке выше.
Теперь добавим ограничение к программам/процессам, которые хотим ограничить, открываем:
В приведенных выше строках устанавливаем следующие правила:
- Для пользователя (captain) ограничиваем CPU. Для этого, ему назначаем group1 группу.
- Процессы firefox запускаемые от любого пользователя, будут автоматически добавлены в browsers группу и ограничеваем в подсистеме CPU и RAM.
- Процессы hdparm запускаемые от любого пользователя, будут добавленs в blkio группу с ограничением подсистемы blkio в соответствии с значениями параметров, указанными в этой группе.
- Все процессы, выполняемые пользователем sammy, будут добавлены в лимитированную группу и ограничены в подсистеме blkio.
- Процессы memhog, запускаемые кем-либо из группы admin, будут добавлены в limitmem cgroup и ограничены по памяти.
- Процессы cpuhog, выполняемые от любого пользователя, будут добавлены в limitcpu группу и ограничены по CPU.
Нам нужно запустить/перезапустить cgred-службу, чтобы изменения конфигурации cgrules вступили в силу, сделайте это, используя команду:
Нам также необходимо убедиться, что служба cgred включена для запуска при атозагрузке системы, чтобы наши правила сохранялись при перезагрузке:
ЗАМЕЧАНИЕ: Для служб, которые поддерживают sysconfig, вы можете добавить CGROUP_DAEMON=»subsystem:control_group» переменную в /etc/sysconfig/servicename вместо редактирования файла cgrules.conf. Например, для httpd службы, вы можете добавить CGROUP_DAEMON=»blkio:/limitio» в файл /etc/sysconfig/httpd.conf, чтобы добавить httpd-процессы в группу limitio.
Использование, тестирование cgroups в Unix/Linux
Запуск службы cgconfig создает виртуальную файловую систему, установленную в /cgroup со всеми подсистемами. Проверим это:
Получаем следующие подсистемы:
Можно запустить команду `lscgroup ‘для проверки:
Вы увидите подсистемы в несколько иной компоновке:
Протестируем ограничение на диск, для этого — нужно установить утилиту hdparm. Например, для rpm’s ОС, выполните:
Теперь давайте запустим команду для измерения скорости чтения вашего жесткого диска, например:
Вывод будет такой:
На выходе показана пропускная способность диска 2 МБ/с. Если вы остановите службы cgconfig и cgred и снова запустите команду hdparm, вы можете увидеть исходную/стандартную скорость чтения с того момента, когда правила группы не были реализованы.
Создание cgroups в Unix/Linux
Чтобы создать CGroup c ограничением по CPU/RAM, выполним:
- cpu,memory — Какие ресурсы будут ограничены. Можно еще ограничить — cpuset,cpuacct.
- your_cgroup_name — Название вашей cgroup группы.
Можно установить ограничение прям в консоле, например, — установим ограничение по использованию RAM:
Можно установить ограничение прям в консоле, например, — установим ограничение по использованию CPU приоритет до
10% (1024 — это 100% приоритет):
Если используете systemD, то можно использовать SystemD Slices, нпример:
Или, можно закинуть в fstab:
Мне этого хватило что-бы пофиксить кое-что связанное с докером. Если появятся мысли что дополнить — обязательно дополню. Вот и все, статья «Установка cgroups в Unix/Linux» завершена.
One thought on “ Установка cgroups в Unix/Linux ”
Подскажите пожалуйста в Centos8 не находит демона systemctl restart cgred.service.
]# yum install libcgroup
]# yum install libcgroup-tools
Все делаю как у Вас описано в статье. Второй день не могу понять что не так делаю. Подскажите пожалуйста. Спасибо.
Добавить комментарий Отменить ответ
Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.
Источник