centOS 6:
1. 启用cgroup
查看内核是否支持cgroup功能:cat /boot/config-`uname -r` | grep -i rt_group
查看支持的子系统:lssubsys
2. 关闭SELinux。SELinux会阻止cgconfigparser的写操作,所以需要关闭SELinux
修改/etc/selinux/config文件,设置SELINUX=disabled,并reboot
3. 配置cgrules.conf和cgconfig.conf。
cgrules.conf:
zoro cpu zoro
jerry cpu jerry
cgconfig.conf:
mount { cpuset = /cgroup/cpuset; cpu = /cgroup/cpu; cpuacct = /cgroup/cpu; memory = /cgroup/memory; devices = /cgroup/devices; freezer = /cgroup/freezer; net_cls = /cgroup/net_cls; blkio = /cgroup/blkio; } group zoro { cpu { cpu.cfs_perios_us = 100000; cpu.cfs_quota_us = 10000; } } group jerry { cpu { cpu.cfs_perios_us = 100000; cpu.cfs_quota_us = 10000; } }
4. 重启cgconfig服务
* systemctl restart cgconfig.service
* systemctl restart cgred.service
centOS 7
centos7把cgroup设置在了/sys/fs/cgroup/目录下,所以上面的方法会报错。
1.vim /etc/cgrules.conf
@research memory finance ## research组
@research cpu,cpuacct finance ## research组
2.vim /etc/cgconfig.conf
mount { cpu = /cgroup/cpu/; cpuacct = /cgroup/cpu/; memory = /cgroup/memory/; } group finance { cpu { cpu.cfs_period_us=100000; cpu.cfs_quota_us=10000; } memory { memory.limit_in_bytes=100M; memory.memsw.limit_in_bytes = 102M; } }
3.mkdir -p /cgroup/cpu
4.mkdir -p /cgroup/cpuacct
5.mkdir -p /cgroup/memory
6.service cgconfig restart.
如果报错,则尝试运行: umount /cgroup/cpu umount /cgroup/memory /usr/sbin/cgclear -l /etc/cgconfig.conf -L /etc/cgconfig.d -e /usr/sbin/cgconfigparser -l /etc/cgconfig.conf -L /etc/cgconfig.d -s 1664 如果还是报错,尝试手动创建: mount -t cgroup -o cpu,cpuacct cpu /cgroup/cpu mount -t cgroup -o memory memory /cgroup/memory mkdir -p /cgroup/cpu/finance mkdir -p /cgroup/memory/finance echo 100000 > /cgroup/cpu/finance/cpu.cfs_period_us echo 10000 > /cgroup/cpu/finance/cpu.cfs_quota_us 检查各配置的值是否正确写入文件,如果没有,则手动写入 echo 100000 > /cgroup/cpu/finance/cpu.cfs_period_us echo 10000 > /cgroup/cpu/finance/cpu.cfs_quota_us
7.service cgred restart
如果重启了机器,需重新运行第4、5步。
另一个方法CentOS 7:
直接使用/sys/fs/cgroup/目录:
1./etc/cgrules.conf:
@research memory finance ## research组
@research cpu,cpuacct finance ## research组
2./etc/cgconfig.conf
group finance { cpu { cpu.cfs_period_us=100000; cpu.cfs_quota_us=10000; } memory { memory.limit_in_bytes=100M; memory.memsw.limit_in_bytes = 102M; } }
3.service cgconfig restart.
如果报错,则尝试运行: /usr/sbin/cgclear -l /etc/cgconfig.conf -L /etc/cgconfig.d -e /usr/sbin/cgconfigparser -l /etc/cgconfig.conf -L /etc/cgconfig.d -s 1664 检查各配置的值是否正确写入文件,如果没有,则手动写入 echo 100000 > /cgroup/cpu/finance/cpu.cfs_period_us echo 10000 > /cgroup/cpu/finance/cpu.cfs_quota_us
4.service cgred restart
辅助命令
lscgroup lssubsys -am mount -t group cgclear,cgcreate,cgdelete,cgset,cgget,cgexec # 使用这一系列命令也可以创建组,但是不能和用户/用户组绑定,只能和进程绑定 lsof file/dir
fuser file/dir cat /proc/[pid]/cgroup ps -o cgroup [pid]
记录
a) 有时候会报错: *** resource busy 或 cpu already mounted等, 解决办法: umount /cgroup/cpu,如果还是报错,再尝试Ctrl+D登出,再登入。
b) 在配置文件/etc/cgrules.conf中,最好把 @research memory finnce @research cpu,cpuacct finance 1.memory的配置放在cpu的配置前面,原因未知,如果memory在cpu后面配置, 可能会导致/cgroup/memory/finance没有用上,也就是memory限制没生效 2.cpu,cpuacct可以放在一起,也可以分开放,有的时候放在一起会报错, 有的时候分开会报错,可能和已有的挂载有关。。。
默认到达memory的限制之后,会kill掉进程,如果想保持进程,可以修改memory.oom_control中的oom_kill_disable值: echo 1 > memory.oom_control ## 1代表不杀死进程,转而让进程进入‘D’状态等待内存资源。 但是这样容易多进程进入死锁状态。