天天看點

cgroup 術語和規則

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

cgroup 術語和規則

規則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是完全一緻的。

cgroup 術語和規則

規則3

一個程序在同一個hierarchy中,不能屬于這個hierarchy的多個cgroup中。

但是可以屬于多個hierarchy中。

cgroup 術語和規則

規則4

程序fork的子程序,會自動放到父程序對應cgroup中。

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