linux的qos机制 - cgroup篇 (1)

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!




你可能感兴趣的:(Linux)