如果你的程序需要使用cgroup,那么用systemd实现的cgroup功能会更方便。
之前用cgroup时遇到一个问题,在ubuntu18上写入cgroup的pid过一会就会消失,但是pid所属进程并没有挂掉,代码如下:
echo '{{ cpu_total }}' > /sys/fs/cgroup/cpu/{{ cpu_cgroup_name }}/cpu.cfs_period_us
echo '{{ cpu_limit }}' > /sys/fs/cgroup/cpu/{{ cpu_cgroup_name }}/cpu.cfs_quota_us
echo {{pid}} >> /sys/fs/cgroup/cpu/{{ cpu_cgroup_name }}/cgroup.procs
然后在cgroup目录下
grep {{ pid }} -r .
发现,我的pid竟然在system.slice下面
cgroup有一个特性,把pid写入新的cgroup,其他cgroup中的同一控制组(如cpu,memory)中的该pid就会被移除掉。
所以我的cgroup中的pid是被systemd给顶掉了,发现是某个版本以上的systemd中,默认会把systemd service的pid加入到system.slice中。
找了一下看到了专门描述systemd这一功能的文章:
第 1 章 控制群组简介 Red Hat Enterprise Linux 7 | Red Hat Customer Portal
然后发现,我之前的代码,放到.service文件里面,只需要加一行
CPUQuota={{ processer_vcpus * 100 * 0.9 }}
就完成了,简单又安全。
[Unit]
Description=ClickHouse Server (analytic DBMS for big data)
Requires=network-online.target
After=network-online.target
[Service]
Type=simple
CPUQuota={{ processer_vcpus * 100 * 0.9 }}
Restart=always
RestartSec=30
RuntimeDirectory=clickhouse-server
ExecStart=/usr/bin/clickhouse-server --config=/datadisk/conf/clickhouse-server/config.xml --pid-file=/datadisk/clickhouse/clickhouse-server.pid
LimitCORE=infinity
LimitNOFILE=2000000
User=root
[Install]
WantedBy=multi-user.target
参考:
第 1 章 控制群组简介 Red Hat Enterprise Linux 7 | Red Hat Customer Portal