我的家庭服务器正在运行一些老旧的硬件(Core i5-3450,SATA 磁盘上的软件 RAID1),并且在运行性能密集型任务(例如编译作业)以及在后台运行的“正常”服务(DNS、Web、DHCP、邮件等)时经常会出现问题。
最近,当一个编译作业的 CPU 使用率接近 100% 时,我的系统几乎被毁了,结果等待 I/O 也猛增,基本上没有其他进程能够再获得任何可用资源。
我阅读了有关 cgroup2 的资料并尝试了一下。设置 grub 选项systemd.unified_cgroup_hierarchy=1
并重新启动。创建了一个新的 cgroup,激活了 I/O 和 CPU 控制器,能够将编译器的 PID 放入 cgroup.procs,并能够成功地将其置于“后台”运行,仅占用 5% 的 CPU,不会干扰系统的其余部分。编译工作几乎花了很长时间(几天),但我不介意。然而,每天多次,我的 cpu.max 设置突然消失,系统再次失去平衡。在阅读了有关 cgroup 和 systemd 的更多信息后,我相信这是因为我确实干预了 systemd 控制,基本上 systemd 似乎将我的自定义设置重置为默认值(cpu.max == 'max 1000000'),然后开始破坏我的系统。
因此我阅读了有关如何正确执行此操作的资料。
首先,我设置Delegate=true
我的[email protected]
文件并重新启动。
然后我尝试通过运行生成一个新的“作业”,systemd-run --user CPUQuota=5% stress-ng --matrix 0 -t 10m
该作业成功运行,即每个进程的 CPU 使用率限制为每个 Stress-ng 线程 5%/4!
我可以看到下面有一个包含我的设置的新目录:/sys/fs/cgroup/user.slice/user-1000.slice/[email protected]
cat /sys/fs/cgroup/user.slice/user-1000.slice/[email protected]/run-raef937da699b484b80f1bf03bc049f7a.service/cpu.max
5000 100000
并cgroups.procs
包含stress-ng的相应PID。成功!
现在我可能想改变这个设置。要么因为它是也低还是其他原因。我可以直接将另一个值写入 cpu.max 吗?或者我应该使用 systemd 命令工具来执行此操作?(哪一个?)
我的另一个问题是:如果我事先不知道我要运行的命令可能会对我的系统性能产生不良影响,那么我该如何在不终止它并使用 systemd-run 重新运行的情况下稍后约束它?
假设我刚刚在 shell 中运行“stress-ng”(没有 systemd-run),我可以看到它的 PID 是正常会话 cgroup 的成员
cat /proc/742779/cgroup
0::/user.slice/user-1000.slice/session-2232.scope
但那cgroup 由 systemd 管理,所以我不应该(也不能以普通用户权限)写入它的 cpu.max、io.max 等结构,对吗?
session-xxx.scope
对于已经在 中而不是在我的 下运行的进程,我有哪些限制方法[email protected]
?我可以“取得 PID 742779 的所有权”并以某种方式将其转移到我的[email protected]
会话中吗?
我知道有 cgcreate、cgclassify 等,但这些仅适用于 cgroup1,对吗?(至少他们给了我cgcreate: libcgroup initialization failed: Cgroup is not mounted
结果。)
答案1
正如其他地方所写,systemctl set-property
(手册页) 可能就是您要找的东西。