如果 CGroups 失败,建议如何处理受控进程?

如果 CGroups 失败,建议如何处理受控进程?

我一直在使用下面的服务单元来启动几个进程,这些进程在运行时恰好具有较高的 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

并且https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/resource_management_guide/sec-Modifying_Control_Groups#sec-Modifying_Unit_Files

总而言之,您只需在 [Service] 部分中添加准确的资源控制关键字并删除 cgroup 服务单元即可完成您想要的操作。

相关内容