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’状态等待内存资源。
但是这样容易多进程进入死锁状态。

 

posted on 2018-03-27 16:07  SimbaStar  阅读(3685)  评论(0编辑  收藏  举报