我一直在使用下面的服务单元来启动几个进程,这些进程在运行时恰好具有较高的 CPU 和磁盘带宽使用率。
由于我想要限制的进程没有办法指示它们应该占用多少资源,所以我一直在使用 CGroups 来控制它们应该占用多少可用资源。
问题是,如果 CGroups 失败,系统将变得无响应并需要重新启动,因此我希望在这种情况下有一种方法可以停止这些进程。
CGroups 的服务单元应该在失败时重新启动服务,但由于某种原因它没有这样做,可能是因为系统没有响应。
我也没有日志,因为系统由于资源使用率高而关闭,并且在管理员取消暂停之前我无法访问该信息。
服务单位受限
[Unit]
Description=HIGH RESOURCES USAGE daemon
After=cgroups.service network.target
[Service]
User=myuser
Group=myuser
ExecStart=/usr/bin/xxxxxxxx
ExecStop=/usr/bin/killall -w -s 2 /usr/bin/xxxxxxxx
WorkingDirectory=/home/myuser
[Install]
WantedBy=multi-user.target
CGroups 服务单元
[Unit]
Description=Load cgroup configs
After=remote-fs.target
[Service]
Type=forking
ExecStartPre=/bin/echo "Processing /etc/cgconfig.conf..."
ExecStartPre=/usr/sbin/cgconfigparser -l /etc/cgconfig.conf
ExecStartPre=/bin/echo "Processing /etc/cgrules.conf..."
ExecStart=/usr/sbin/cgrulesengd --logfile=/var/log/cgrulesengd.log
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
配置文件
group app_limit {
cpu {
cpu.cfs_quota_us = 200000
cpu.cfs_period_us = 1000000
}
blkio {
blkio.throttle.read_iops_device = "253:0 35";
blkio.throttle.write_iops_device = "253:0 35";
blkio.throttle.write_bps_device = "253:0 262144000";
}
}
配置文件
myuser cpu,blkio app_limit/
答案1
似乎您正在尝试使用旧的东西来管理 cgroups,而 systemd 已经嵌入了完成这项工作所需的一切。cgconfig 已被弃用,并且不能在 systemd 运行时使用。
你应该看看https://www.freedesktop.org/software/systemd/man/systemd.resource-control.html
总而言之,您只需在 [Service] 部分中添加准确的资源控制关键字并删除 cgroup 服务单元即可完成您想要的操作。