cgroup使用过程的一些问题

关于cgroup的介绍:http://www.kernel.org/doc/Documentation/cgroups/cgroups.txt

目的是控制进程间资源的竞争,资源包括CPU,MEMORY,IO,DEVICE等。

 

内核版本:2.6.32-131.6.1

普通的信息网上到处都找得到,比如如何进行最简单的测试,但是一旦碰到问题,就发现信息太少了,记录下其中碰到的几个问题:

1. 在多核cpu中,两个进程会各自占用独立的cpu,这时候cpu.shares的设置是无效的,需要使用cpuset限制进程的cpu亲缘性

2. 在使用cpuset进行task写入的时候,可能会碰到no sapce left,原因是当前机器只有memory node或者kernel在编译的时候是按照一个memory node编译的,这个时候需要将0写入/cgroup/cpuset/group-name/cpuset.mems,以指示使用0号内存节点

3. 如果碰到permission denied,一个原因是shell使用错误,比如sudo echo "x" >> y 并没有真正按照root执行echo,需要写成sudo bash -c 'echo "x">y',具体原因google 一大堆。

4. 对于多线程的程序,cpu限制很困难,因为这个时候将进程pid写入tasks是没用的,linux会将每个线程当做进程对待,结果就是仍然控制不住各个进程内线程的使用,有三个办法解决:

    a. 将启动进程的shell pid加入tasks,sudo bash -c "echo $$ > /cgroup/cpuset/group-name/tasks"

    b. 将TGID(就是PID)写入cgroups.procs,需要升级到RHEL6(没试验,不想装系统了);对于低版本内核,报

bash: line 0: echo: write error: Invalid argument错误。

    c. 使用libcgroup规则引擎将所有thread id加入tasks

posted on 2012-10-17 00:37  RaymondSQ  阅读(5860)  评论(1编辑  收藏  举报