安装
CentOS 6
yum install libcgroup
CentOS 7
yum install libcgroup-tools
使用
默认情况下有几个控制器可以进行限制,分别是
- cpuset
- cpu,cpuacct
- memory
- devices
- freezer
- net_cls
- blkio
- perf_event
- hugetlb
限制CPU负载
我写了一个脚本来消耗CPU
count.sh
#!/bin/bash
N=0
while true; do
N=$((N+1))
echo $N
done
执行命令
CMD=/root/count.sh
cgcreate -g cpu:/cpu50
cgset -r cpu.cfs_quota_us=50000 cpu50
cgexec -g cpu:cpu50 $CMD
可见 count.sh 的CPU负载一直维持在50%以内
[root@app-client ~]# ps aux | grep count.sh
root 18594 48.2 0.0 106152 1032 pts/0 R+ 09:53 0:11 /bin/bash /root/count.sh
root 18666 0.0 0.0 103304 808 pts/1 S+ 09:54 0:00 grep count.sh
此外也可以把已经在运行的进程加入cgroup限制,不需要重启程序。
先执行
/root/count.sh
获取进程号
[root@app-client ~]# ps aux | grep count.sh
root 18695 62.1 0.0 106152 1036 pts/0 R+ 09:57 0:04 /bin/bash ./count.sh
root 18697 0.0 0.0 103304 808 pts/1 S+ 09:57 0:00 grep count.sh
把进程加入控制器
cgclassify -g cpu:cpu50 18695
Tips:
一个资源组可以加多个进程,资源组限制的是加入该组的进程资源总和。比如上面例子,限制50%的负载,是指所有该组的进程总共消耗50%的负载,而不是每个资源能消耗50%的负载。
可以用 lscgroup 查看配置的控制器
[root@app-client ~]# lscgroup
cpuset:/
cpu:/
cpu:/cpu50
cpuacct:/
memory:/
devices:/
freezer:/
net_cls:/
blkio:/
可以用命令 cgdelete 进行控制器的删除。
所有控制器格式
请参考 https://www.kernel.org/doc/Documentation/
比较常用的有
- blkio.throttle.read_bps_device – 磁盘读取限速
- blkio.throttle.write_bps_device – 磁盘写入限速
- cpu.cfs_quota_us – CPU load限制
- memory.limit_in_bytes – 最大内存限制
- cpuset.cpus – 绑定CPU的core,必须和 cpuset.mems 一起使用。
其他
各种控制器,除了使用 cg 系列命令可以修改,也可以直接修改映射到文件系统的目录。默认情况下,CentOS 6 的路径是 /cgroup ,CentOS 7 的路径是 /sys/fs/cgroup 。
配置文件 /etc/cgconfig.conf 或者目录 /etc/cgconfig.d/ 下可对映射的路径进行配置,有兴趣请自行打开看看。
比如 CentOS 6 下的默认配置是
mount { cpuset = /cgroup/cpuset; cpu = /cgroup/cpu; cpuacct = /cgroup/cpuacct; memory = /cgroup/memory; devices = /cgroup/devices; freezer = /cgroup/freezer; net_cls = /cgroup/net_cls; blkio = /cgroup/blkio; }
cgroup实践-资源控制
原文链接
相关链接:
cgroup基本介绍
cgroup资源限制
cgroups介绍及安装配置使用详解
how to use cgroup