На моем домашнем сервере работает устаревшее оборудование (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 не смонтирована
как результат.)