Рейтинг:0

Как ограничить уже запущенные интерактивные процессы с помощью cgroup2

флаг br

На моем домашнем сервере работает устаревшее оборудование (Core i5-3450, программный RAID1 на дисках SATA), и у него часто возникают проблемы, когда я запускаю ресурсоемкие задачи, такие как задание компиляции, помимо «обычных» служб, работающих в фоновом режиме (DNS, Интернет, DHCP, почта и т. д. и т. д.)

Недавно я чуть не сломал свою систему, когда задача компиляции достигла почти 100% загрузки ЦП, и, как следствие, резко возросло количество операций ввода-вывода, и в основном ни один другой процесс больше не мог получить никаких свободных ресурсов.

Я прочитал о cgroup2 и попробовал. Установите параметр grub systemd.unified_cgroup_hierarchy=1 и перезагрузился. Создал новую cgroup, активировал контроллер ввода-вывода и ЦП и смог бросить PID моего компилятора в cgroup.procs и смог успешно поместить его в «фон», работающий только с 5% ЦП и не мешающий остальной части. система. Работа по компиляции заняла почти целую вечность (несколько дней), но я не возражал. Однако несколько раз в день внезапно мои настройки cpu.max исчезали, и система снова выходила из равновесия.Прочитав больше о cgroup и systemd, я полагаю, что это потому, что я вмешивался в элементы управления systemd, и в основном systemd, казалось, сбрасывал мои пользовательские настройки обратно к значениям по умолчанию (cpu.max == 'max 1000000'), которые затем начали разрушать мою систему.

Поэтому я прочитал о том, как это сделать правильно.

Сначала я установил Делегат = истина к моему пользователь@1000.сервис файл и перезагрузился.

Затем я попытался создать новую «работу», запустив systemd-run --user CPUQuota=5% stress-ng --matrix 0 -t 10 м который работал успешно, т.е. использование ЦП на процесс было ограничено 5%/4 на поток stress-ng!

Я вижу новый каталог ниже /sys/fs/cgroup/user.slice/user-1000.slice/[email protected] который содержит мою настройку:

кошка /sys/fs/cgroup/user.slice/user-1000.slice/[email protected]/run-raef937da699b484b80f1bf03bc049f7a.service/cpu.max
5000 100000

и cgroups.procs содержит соответствующий PID для stress-ng. Успех!

Теперь я, возможно, захочу изменить этот параметр. Либо потому что это тоже низкая или по какой другой причине. Могу ли я просто записать другое значение непосредственно в cpu.max? Или я должен использовать командный инструмент systemd для этого? (Который из?)

Моя другая проблема: если я заранее не знаю, что команда, которую я собираюсь запустить, может плохо повлиять на производительность моей системы, как я могу ограничить ее позже, не убивая ее и повторно запуская с помощью systemd- бег?

Предположим, я просто запускаю «stress-ng» в своей оболочке (без systemd-run), я вижу, что его PID является членом обычной контрольной группы сеанса.

кот /proc/742779/cgroup
0::/user.slice/user-1000.slice/session-2232.scope

Но что cgroup управляется systemd, поэтому я не должен (и не могу с обычными правами пользователя) писать в его структуры cpu.max, io.max и т. д., верно?

Какие способы ограничения у меня есть для уже запущенных процессов, запущенных в сеанс-xxx.scope вместо моего пользователь@1000.сервис? Могу ли я «вступить во владение» PID 742779 и каким-то образом перенести его в свой пользователь@1000.сервис сеанс?

Я знаю, что есть cgcreate, cgclassify и т. д., но это только cgroup1, верно? (По крайней мере, они дают мне cgcreate: ошибка инициализации libcgroup: Cgroup не смонтирована как результат.)

Рейтинг:0
флаг us

как уже писали в другом месте, systemctl set-property(справочная страница) может быть то, что вы ищете.

cyberschlumpf avatar
флаг br
Спасибо stobia! Есть ли способ перевести этот конкретный PID, который я хочу ограничить, на совершенно другую контрольную группу? `systemctl set-property` всегда будет влиять на всю контрольную группу со всеми остальными PID, верно?
флаг us
Я не уверен. `libcgroup`, похоже, [совместима с cgroups v2](https://github.com/libcgroup/libcgroup/issues/12), но у меня нет опыта работы с ней. И да, `systemctl set-property` *всегда* влияет на всю контрольную группу или, точнее, на весь [юнит](https://www.freedesktop.org/software/systemd/man/systemd.unit.html ).

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.