1.测试目的 目前新的稳定版Linux内核(3.2.6)中cgroup的功能和特性都已经比较丰富和完善,用户空间的工具也有了。Cgroup中对于CPU资源的控制主要集中cpu和cpuset这两个子系统,其中cpu子系统主要用来控制进程调度,设置进程占用CPU资源的比重;cpuset则主要是控制进程能够使用哪些CPU和内存节点(NUMA)。 测试的目的主要是对 cgroup 中 cpu 和cpuset这两个子系统的功能进行验证,探索cpu.shares、cpu.rt_period_us 、cpu.rt_runtime_us 等参数功能和使用方法。 2.测试平台: ubuntu 11.10 3.0.0-26-generic-pae 4 Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz 3.测试过程 挂载: mount -t tmpfs cgroup_root /sys/fs/cgroup mkdir /sys/fs/cgroup/cpuset mount -t cgroup -ocpuset cpuset /sys/fs/cgroup/cpuset 创建目录: root@ubuntu:/sys/fs/cgroup/cpuset# mkdir tailor tinker 挂载 : root@ubuntu:~# mount -t cgroup -o cpu none /sys/fs/cgroup/cpu 创建目录: root@ubuntu:/sys/fs/cgroup/cpu# mkdir tailor tinker 启动两个测试程序: sina@ubuntu:~$ ./a.out & [2] 3944 sina@ubuntu:~$ ./a.out & [2] 3945 将测试进程放到 cpu cpuset分支里面: sina@ubuntu:/sys/fs/cgroup/cpuset/tinker$ echo 3944 > tasks sina@ubuntu:/sys/fs/cgroup/cpuset/tailor$ echo 3945 > tasks sina@ubuntu:/sys/fs/cgroup/cpu/tailor$ echo 3945 > tasks sina@ubuntu:/sys/fs/cgroup/cpu/tinker$ echo 3944 > tasks 设置 cpu分支里面的 cpu.shares [html] view plaincopy sina@ubuntu:/sys/fs/cgroup/cpu/tailor$ echo 1024 > cpu.shares sina@ubuntu:/sys/fs/cgroup/cpu/tinker$ echo 512 > cpu.shares 设置两个组的cpu affinity: sina@ubuntu:/sys/fs/cgroup/cpuset/tailor$ echo 3 > cpuset.cpus sina@ubuntu:/sys/fs/cgroup/cpuset/tinker$ echo 3 > cpuset.cpus 一段时间之后观察cpu使用率:(因为 内核调度等方面的原因,需要等待很久才能得到如下结果)
root@ubuntu:~# ps -C a.out -opid,%cpu,psr,args PID %CPU PSR COMMAND 3944 33.6 3 ./a.out 3945 66.4 3 ./a.out 再启动一个测试程序: [html] view plaincopy sina@ubuntu:~$ ./a.out & [2] 5503 可观察到cpu使用率是 : root@ubuntu:~# ps -C a.out -opid,%cpu,psr,args PID %CPU PSR COMMAND 5503 99.6 1 ./a.out 仅将进程 5503 放到 cpu子系统中,一段时间后观察cpu使用率: root@ubuntu:/sys/fs/cgroup/cpu/tailor# echo 5503 > tasks 可看到几乎没什么变化:(因为这个时候还没有设置 进程的cpu affinity 属性) root@ubuntu:~# ps -C a.out -opid,%cpu,psr,args PID %CPU PSR COMMAND 3944 33.6 3 ./a.out 3945 66.4 3 ./a.out 5503 99.6 1 ./a.out 再将进程 5503 放到 cpuset 子系统中,一段时间后观察cpu使用率: root@ubuntu:/sys/fs/cgroup/cpuset/tailor# echo 5503 > tasks root@ubuntu:~# ps -C a.out -opid,%cpu,psr,args PID %CPU PSR COMMAND 3944 33.4 3 ./a.out 3945 33.3 3 ./a.out 5503 33.3 3 ./a.out 结论:从上面的测试结果可以看出,各个 cgroup 之间基本上能够按照 cpu.shares 设定的比例共享CPU资源,对于同一个cgroup中的一组进程则被公平的调度。 测试运用 cpu.rt_period_us 和 cpu.rt_runtime_us 来控制CPU资源的分配 [html] view plaincopy root@ubuntu:/sys/fs/cgroup/cpu/tailor# echo 200000 > cpu.rt_runtime_us 一段时间之后观察 3 进程的cpu使用率: root@ubuntu:~# ps -C a.out -opid,%cpu,psr,args PID %CPU PSR COMMAND 3944 33.4 3 ./a.out 3945 10.0 3 ./a.out 5503 9.9 3 ./a.out 通过上面结果可以看出 设置 cpu.rt_runtime_us 和 cpu.rt_period_us 可以 设置CPU的利用率上限,不会让某个进程或虚拟机占用过多的CPU资源。