cgroup是linux下用于隔離或管理資源使用的手段。、
redhat有比較詳細的介紹。
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/resource_management_guide/sec-relationships_between_subsystems_hierarchies_control_groups_and_tasks.html
首先需要了解幾個術語,可以幫助了解cgroup的原理。
1. subsystems: 即資源分類,例如cpu , memory, cpu, cpuset, blkio等。安裝了cgconfig服務的話可以通過配置檔案/etc/cgconfig.conf檢視詳情。
2. hierarchies: 即資源管理的邏輯最高層級。hierachies通過mount來挂載,系統中可以挂載多個hierachies. 所有的程序pid最初都隸屬于這個層級。
3. control groups: 屬于hierachie中的下級, cgroup中還可以繼續建立cgroup, 這種cgroup下的cgroup并不代表層級關系,隻是路徑而已。cgroup在同一個hierachie中,是平級的,(不管這個cgroup放在哪個路徑下, 例如/cgroup/cpu/cg1, /cgroup/cpu/cg2, /cgroup/cpu/cg1/cg3, cg1,cg2,cg3它們是平級的。)。
4. tasks: 即程序pid.
規則講解
使用cgroup進行資源管理時,必須遵循的規則如下:
規則1
單個hierarchy可以包含多個subsystem, 例如
mkdir /cgroup/cpu_mem_cg
mount -t cgroup -o cpu,memory cpu_mem_cg /cgroup/cpu_mem_cg
mkdir /cgroup/cpu_mem_cg/cg1
mkdir /cgroup/cpu_mem_cg/cg2
規則2
一個subsystem隻能屬于一個hierarchy,(有一種情況一個subsystem可以屬于多個hierarchy,這些hierarchy的sub system必須完全一樣)
例如
mkdir /cgroup/cpu_cg
mount -t cgroup -o cpu cpu_cg /cgroup/cpu_cg
mount -t cgroup -o memory cpu_mem_cg /cgroup/cpu_mem_cg
再執行以下指令将報錯, 因為cpu_mem_cg這個hierarchy已經包含了一個subsystem memory,是以cpu subsystem不能同時挂載在這兩個hierarchy下。
mount -t cgroup -o cpu cpu_mem_cg /cgroup/cpu_mem_cg
有一種情況是允許一個subsystem挂載多個hierarchy下的,當這些hierarchy的subsystem完全一緻時。例如
#mkdir /cgroup/cg1
#mkdir /cgroup/cg2
#mount -t cgroup -o cpu,memory cg1 /cgroup/cg1
#mount -t cgroup -o cpu,memory cg2 /cgroup/cg2
這樣做并沒有什麼意義,因為同一個pid會同時出現在這兩個hierarchy中。并且在這兩個hierarchy中的任意一個中建立cgroup時,另一個hierarchy中也會自動建立對應的cgroup,還有當task從hierarchy調整到cgroup中時,另一個hierarchy中對應的pid也會自動調整到對應的cgroup中,這兩個hierarchy是完全一緻的。
規則3
一個程序在同一個hierarchy中,不能屬于這個hierarchy的多個cgroup中。
但是可以屬于多個hierarchy中。
規則4
程序fork的子程序,會自動放到父程序對應cgroup中。
最後思考一個問題。
能同時控制一組程序的單個程序的iops和一組程序的總iops麼?
pid a
iops <=3000
pid b
pid c
pid d
同時需要限制
pid a+b+c+d
iops <= 8000
目前cgroup版本并不能滿足這個需求。
又例如一組pid有10個pid,每個pid限制iops=100,但是要求10個程序同時使用的iops不能超過500.
這個目前無法滿足,因為cgroup在一個hierarchy中是平級的。
以下方法不行:
(同一個hierarchy中的不同cgroup,它們屬于同一層級)
/cgroup/blkio/blkio.throttle.write_iops_device
"8:16 5000"
/cgroup/blkio/tasks
pid 非a,b
/cgroup/blkio/cg1/blkio.throttle.write_iops_device
"8:16 3000"
/cgroup/blkio/cg1/tasks
pid a
/cgroup/blkio/cg2/blkio.throttle.write_iops_device
/cgroup/blkio/cg2/tasks
pid b
以下方法也不行:
(使用不同的hierarchy,但是同一個subsystem隻能屬于一個hierarchy,或者完全一緻的hierarchy。)
/cgroup/blkio1/blkio.throttle.write_iops_device
/cgroup/blkio1/tasks
/cgroup/blkio2/blkio.throttle.write_iops_device
/cgroup/blkio_all/blkio.throttle.write_iops_device
pid a,b