cgroups全称control groups,在RHEL6的2.6.32内核中已经包括了cgroup的patch。这里强烈建议安装RHEL6(CentOS6)来使用cgroups,如果没有的话,只能升级内核了 ( > 2.6.26版本)
下面的例子通过对cgroups的blkio, cpuset, memory三个子系统的实现来演示如何应用cgroups,我们这里不使用红帽子的libcgroup package提供的工具,通过该工具进行cgroup的操作详见这篇 http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/pdf/Resource_Management_Guide/Red_Hat_Enterprise_Linux-6-Resource_Management_Guide-en-US.pdf
1. cpu子系统
cpu.shares:假设cgroup A的tasks的cpu.shares值为1,cgroup B的tasks的cpu.shares值为2,则cgroup B的进程占用的cpu时间是cgroup A上进程的2倍。
cpu.rt_runtime_us
cpu.rt_period_us:这两个值建议不要设,让OS去调度占用的CPU时间的绝对值。
# mkdir /cgroup/cpu
# mount -t cgroup -o cpu none /cgroup/cpu
# mkdir /cgroup/cpu/tinker
# mkdir /cgroup/cpu/tailor
首先创建好cpu subsys的 cgroups,一共3个,可以从/proc/cgroups查询到。下面通过taskset -c 0指定程序的cpu affinity为cpu 0,启动2个进程
# taskset -c 0 yes low > /dev/null &
# taskset -c 0 yes high > /dev/null &
同时把两个pid分别echo $pid > tasks 文件中。修改cpu/tinker的cpu.shares为2048, cpu/tailor的cpu.shares为512,下面通过ps看他们的cpu占用率吧
# ps -C yes -opid,%cpu,psr,args
PID %CPU PSR COMMAND
19163 20.8 0 yes low
19164 79.4 0 yes high
tips:
1) 较低内核版本有个bug,详情见 http://lists.linux-foundation.org/pipermail/containers/2008-September/012948.html,推荐使用 > RHEL6.0作为服务器
2) 删除child cgroup请用rmdir,rm -rf是无效的
3) 可能是内核调度器的算法,设置了cpu.shares之后CPU利用率不会立刻就变为shares指定的那样,需要等待一段时间,基本上是个曲线的变化过程,之后就正确了。
2. cpuacct子系统
没啥好讲的,跳过
3. cpuset子系统
cpuset.cpus, cpuset.mems 表示不同cgroup的tasks可以使用的cpu核以及cpu对应的memory node (NUMA架构下),
cpuset.cpu_exclusive cpuset.mem_exclusive 表示是否共享该核以及对应的memory node (NUMA架构下),一般都为0表示可以共享
cpuset.sched_load_balance 表示是否对cpuset的所有CPU做负载平衡
cpuset.sched_relax_domain_level 表示调度策略,具体不赘述了
cpuset是和cpu affinity相关的,做实验如下:
# mount -t cgroup -o remount, cpuset none /cgroup/cpu
# mkdir tinker
# echo 0 > tinker/cpuset.cpus
启动一个进程,查看其cpu affinity
# yes hello > /dev/null &
[1] 19425
# taskset -p 19425
pid 19425's current affinity mask: 3
# taskset -c -p 19425
pid 19425's current affinity list: 0,1
# echo 19425 > tinker/tasks
# taskset -c -p 19425
pid 19425's current affinity list: 0
可以看出由于cpuset只有CPU 0,当把进程挂到cgroup tinker上之后,其CPU affinity也变为0
下面把cgroup tinker的cpu_exclusive设为1,表示独占该CPU
# echo 1 > tinker/cpuset.cpu_exclusive
# mkdir tailor
# echo 0 > tailor/cpuset.cpus
此时报错write error: Invalid argument,因为CPU 0已经被cgroup tinker独占,所以cgroup tailor只能使用CPU1
# echo 1 > tailor/cpuset.cpus
DONE!