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做Server Load Balancer
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!