關於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