天天看點

Cgroups使用一.                      Cgroups介紹二.                      Cgroups基本概念三.                      幾個常用示例四.                      常用cgroups參數

Cgroups使用

一.                      Cgroups介紹

linux核心提供了cgroups控制組(controlgroups)的功能,最初由google的工程師提出,後來被整合進Linux核心。Cgroups也是LXC(LinuxContainer容器是一種核心虛拟化技術,可以提供輕量級的虛拟化,以便隔離程序和資源,而且不需要提供指令解釋機制以及全虛拟化的其他複雜性)為實作虛拟化所使用的資源管理手段。

預設cgroups配置檔案在/etc/cgconfig.conf中,具體的挂載目錄請參見配置檔案。

重新啟動:/etc/init.d/cgconfigrestart

安裝包:yuminstall libcgroup libcgroup-tools

二.                      Cgroups基本概念

1.     控制組(controlgroup)。

控制組就是一組按照某種标準劃分的程序。Cgroups中的資源控制都是以控制組為機關實作。一個程序可以加入到某個控制組,也從一個程序組遷移到另一個控制組。一個程序組的程序可以使用cgroups以控制組為機關配置設定的資源,同時受到cgroups以控制組為機關設定的限制。

2.     層級(hierarchy)。

控制組可以組織成hierarchical的形式,既一顆控制組樹。控制組樹上的子節點控制組是父節點控制組的孩子,繼承父控制組的特定的屬性。

3.     子系統(subsytem)。

一個子系統就是一個資源控制器,比如cpu子系統就是控制cpu時間配置設定的一個控制器。子系統必須附加(attach)到一個層級上才能起作用,一個子系統附加到某個層級以後,這個層級上的所有控制族群都受到這個子系統的控制。可用子系統:

·        blkio--這個子系統為塊裝置設定輸入/輸出限制,比如實體裝置(磁盤,固态硬碟,USB等等)。

·        cpu--這個子系統使用排程程式提供對CPU的cgroup任務通路。

·        cpuacct--這個子系統自動生成cgroup中任務所使用的CPU報告。

·        cpuset--這個子系統為cgroup中的任務配置設定獨立CPU(在多核系統)和記憶體節點。

·        devices--這個子系統可允許或者拒絕cgroup中的任務通路裝置。

·        freezer--這個子系統挂起或者恢複cgroup中的任務。

·        memory--這個子系統設定cgroup中任務使用的記憶體限制,并自動生成由那些任務使用的記憶體資源報告。

·        net_cls--這個子系統使用等級識别符(classid)标記網絡資料包,可允許Linux流量控制程式(tc)識别從具體cgroup中生成的資料包。

·        ns--名稱空間子系統。

三.                      幾個常用示例

1.     CPU使用時間(使用率)限制

mkdir /cgroup/cpu/limit#建立CPU控制組limit,或cgcreate -g cpu:/limit

echo 50000> /cgroup/cpu/limit/cpu.cfs_quota_us #将cpu.cfs_quota_us設定為50000,相當于cpu.cfs_period_us值100000的50%,或cgset-r cpu.cfs_quota_us=50000 limit

echo $pid> /cgroup/cpu/limit/tasks #将需要限制CPU使用率的的程序ID寫到tasks中,或cgclassify -g cpu:limit $pid

echo ‘’ >/cgroup/cpu/limit/tasks #取消限制

rmdir/cgroup/cpu/limit #删除CPU控制組limit,或cgdelete cpu:/limit

2.     CPU資源綁定

mkdir/cgroup/cpuset/limit #建立CPU設定控制組limit,或cgcreate -g cpuset:/limit

echo ‘0-2,16’/cgroup/cpuset/limit/cpuset.cpus #将所綁定的CPU核ID寫入到cpuset.cpus中,或cgset -r cpuset.cpus=‘0-2,16’ limit

echo $pid> /cgroup/cpuset/limit/ tasks #将需要綁定CPU核心的程序ID寫入到tasks中,或cgclassify -g cpuset:limit $pid

3.     記憶體資源限制

mkdir/cgroup/memory/limit #建立記憶體控制組limit

echo 104857600> /cgroup/memory/limit/memory.limit_in_bytes #配置設定100M記憶體給這個控制組

echo $pid> /cgroup/memory/limit/tasks #将需要限制記憶體使用的程序ID寫到tasks中,一旦程序記憶體超過配置的值,将發生OOM killer(Out-Of-Memory killer)

4.     IO資源限制

mkdir /cgroup/blkio/limit#建立IO控制組limit

echo '252:2   1048576' > /cgroup/blkio/limit/blkio.throttle.read_bps_device #限制設定252:2讀速度為1M/s,252:2為對應的主裝置号和副裝置号,可能通過ls -l /dev/vda2 檢視,後面的數字為限制帶寬

echo $pid> /cgroup/blkio/limit/tasks #将需要限制IO的程序ID寫入到tasks中

四.                      常用cgroups參數

通過上面,可以看到調整某個組裡面的參數,并且将程序ID加入到該組中,就可以對程序進行資源控制,以下是可能用到的相關子系統的參數:

1.     blkio

1.1.  blkio.weight

指定cgroup預設可用通路塊I/O的相對比例(權重),範圍在100到1000。這個值可由具體裝置的blkio.weight_device參數覆寫。例如:如果将cgroup通路塊裝置的預設權重設定為500,請運作:

echo 500 > blkio.weight

1.2.  blkio.weight_device

指定對cgroup中可用的具體裝置I/O通路的相對比例(權重),範圍是100到1000。這個值可由為裝置指定的blkio.weight參數覆寫。例如:如果為通路/dev/sda的cgroup配置設定權重500,請運作:

echo "8:0 500" > blkio.weight_device

1.3.  blkio.throttle.read_bps_device

此參數用于設定裝置執行“讀”操作位元組的上限。“讀”的操作率以每秒的位元組數來限定。bytes_per_second是“讀”操作可被執行的上限率。例如,讓/dev/sda裝置運作“讀”操作的最大速率是10MBps,請運作:

echo "8:0 10485760" >/cgroup/blkio/test/blkio.throttle.read_bps_device

1.4.  blkio.throttle.write_bps_devicev

此參數用于設定裝置執行“寫”操作次數的上限。“寫”的操作率用“位元組/秒”來表示。bytes_per_second是“寫”操作可被執行的上限率。例如,讓/dev/sda裝置執行“寫”操作的最大比率為10MBps,請運作:

echo "8:0 10485760"> /cgroup/blkio/test/blkio.throttle.write_bps_device

1.5.  blkio.throttle.read_iops_device

此參數用于設定裝置執行“讀”操作次數的上限。“讀”的操作率以每秒的操作次數來表示。operations_per_second是“讀”可被執行的上限率。例如:如要設定/dev/sda裝置執行“讀”的最大比率為10次/秒,請運作:

echo "8:0 10"> /cgroup/blkio/test/blkio.throttle.read_iops_device

1.6.  blkio.throttle.write_iops_device

此參數用于設定裝置執行“寫”操作次數的上限。“寫”的操作率以每秒的操作次數來表示。operations_per_second是“寫”操作可被執行的上限率。例如:如要讓/dev/sda裝置執行“寫”操作的最大比率為10次/秒,請運作:

echo "8:0 10">/cgroup/blkio/test/blkio.throttle.write_iops_device

2.     cpu

2.1.  cpu.shares

包含用來指定在cgroup中的任務可用的相對共享CPU時間的整數值。例如:在兩個cgroup中都将cpu.shares設定為1的任務将有相同的CPU時間,但在cgroup中将cpu.shares設定為2的任務可使用的CPU時間是在cgroup中将cpu.shares設定為1的任務可使用的CPU時間的兩倍。

2.2.  cpu.cfs_period_us

此參數可以設定重新配置設定cgroup可用CPU資源的時間間隔,機關為微秒(μs,這裡以“us”表示)。如果一個cgroup中的任務在每1秒鐘内有0.2秒的時間可存取一個單獨的CPU,則請将cpu.rt_runtime_us設定為2000000,并将cpu.rt_period_us設定為1000000。cpu.cfs_quota_us參數的上限為1秒,下限為1000微秒。

2.3.  cpu.cfs_quota_us

此參數可以設定在某一階段(由cpu.cfs_period_us規定)某個cgroup中所有任務可運作的時間總量,機關為微秒(μs,這裡以"us"代表)。一旦cgroup中任務用完按配額分得的時間,它們就會被在此階段的時間提醒限制流量,并在進入下階段前禁止運作。如果cgroup中任務在每1秒内有0.2秒,可對單獨CPU進行存取,請将cpu.cfs_quota_us設定為200000,cpu.cfs_period_us設定為1000000。請注意,配額和時間段參數都根據CPU來操作。例如,如要讓一個程序完全利用兩個CPU,請将cpu.cfs_quota_us設定為200000,cpu.cfs_period_us設定為100000。如将cpu.cfs_quota_us的值設定為-1,這表示cgroup不需要遵循任何CPU時間限制。這也是每個cgroup的預設值(rootcgroup除外)。

3.     cpuset

3.1.  cpuset.cpus(強制)

設定該cgroup任務可以通路的CPU。這是一個逗号分隔清單,格式為ASCII,小橫線("-")代表範圍。例如:

0-2,16 表示CPU0、1、2和16。

3.2.  cpuset.mems(強制)

設定該cgroup中任務可以通路的記憶體節點。這是一個逗号分隔清單,格式為ASCII,小橫線("-")代表範圍。例如:

0-2,16 表示記憶體節點0、1、2和16。

4.     memory 

4.1.  memory.limit_in_bytes

設定使用者記憶體(包括檔案緩存)的最大用量。如果沒有指定機關,則該數值将被解讀為位元組。但是可以使用字尾代表更大的機關——k或者K代表千位元組,m或者M代表兆位元組,g或者G代表千兆位元組。您不能使用memory.limit_in_bytes限制rootcgroup;您隻能對層級中較低的群組應用這些值。在memory.limit_in_bytes中寫入-1可以移除全部已有限制。

4.2.  memory.memsw.limit_in_bytes

設定記憶體與swap用量之和的最大值。如果沒有指定機關,則該值将被解讀為位元組。但是可以使用字尾代表更大的機關——k或者K代表千位元組,m或者M代表兆位元組,g或者G代表千兆位元組。您不能使用memory.memsw.limit_in_bytes來限制rootcgroup;您隻能對層級中較低的群組應用這些值。在memory.memsw.limit_in_bytes中寫入-1可以删除已有限制。

4.3.  memory.force_empty

當設定為0時,該cgroup中任務所用的所有頁面記憶體都将被清空。這個接口隻可在cgroup沒有任務時使用。如果無法清空記憶體,請在可能的情況下将其移動到父cgroup中。移除cgroup前請使用memory.force_empty參數以免将廢棄的頁面緩存移動到它的父cgroup中。

4.4.  memory.swappiness

将kernel傾向設定為換出該cgroup中任務所使用的程序記憶體,而不是從頁高速緩沖中再生頁面。這與/proc/sys/vm/swappiness為整體系統設定的傾向、計算方法相同。預設值為60。低于60會降低kernel換出程序記憶體的傾向;高于0會增加kernel換出程序記憶體的傾向。高于100時,kernel将開始換出作為該cgroup中程序位址空間一部分的頁面。請注意:值0不會阻止程序記憶體被換出;系統記憶體不足時,換出仍可能發生,因為全局虛拟記憶體管理邏輯不讀取該cgroup值。要完全鎖定頁面,請使用mlock()而不是cgroup。您不能更改以下群組的swappiness:

rootcgroup,它使用/proc/sys/vm/swappiness設定的swappiness;

有子群組的cgroup。

4.5.  memory.oom_control

包含标簽(0或者1),它可以為cgroup啟用或者禁用“記憶體不足”(OutofMemory,OOM)終止程式。如果啟用(0),嘗試消耗超過其允許記憶體的任務會被OOM終止程式立即終止。預設情況下,所有使用memory子系統的cgroup都會啟用OOM終止程式。要禁用它,請在memory.oom_control檔案中寫入1:

echo 1 > /cgroup/memory/lab1/memory.oom_control

禁用OOM殺手程式後,嘗試使用超過其允許記憶體的任務會被暫停,直到有額外記憶體可用。memory.oom_control檔案也在under_oom條目下報告目前cgroup的OOM狀态。如果該cgroup缺少記憶體,則會暫停它裡面的任務。under_oom條目報告值為1。memory.oom_control檔案可以使用API通知來報告OOM情況的出現。

5.     net_cls

net_cls子系統使用等級識别符(classid)标記網絡資料包,這讓Linux流量管控器(tc)可以識别從特定cgroup中生成的資料包。可配置流量管控器,讓其為不同cgroup中的資料包設定不同的優先級。

5.1.  net_cls.classid

net_cls.classid包含表示流量控制handle的單一數值。從net_cls.classid檔案中讀取的classid值是十進制格式,但寫入該檔案的值則為十六進制格式。例如:0x100001表示控制點通常寫為iproute2所用的10:1格式。在net_cls.classid檔案中,将以數字1048577表示。這些控制點的格式為:0xAAAABBBB,其中AAAA是十六進制主裝置号,BBBB是十六進制副裝置号。您可以忽略前面的零;0x10001與0x00010001一樣,代表1:1。以下是在net_cls.classid檔案中設定10:1控制點的示例:

echo 0x100001 > /cgroup/net_cls/red/net_cls.classid

6.     net_prio

網絡優先權(net_prio)子系統可以為各個cgroup中的應用程式動态配置每個網絡接口的流量優先級。網絡優先級是一個配置設定給網絡流量的數值,可在系統内部和網絡裝置間使用。網絡優先級用來區分發送、排隊以net_prio.prioidx隻讀檔案。它包含一個特有整數值,kernel使用該整數值作為這個cgroup的内部代表。net_prio.ifpriomap包含優先級圖譜,這些優先級被配置設定給源于此群組程序的流量以及通過不同接口離開系統的流量。

echo "eth0 5"> /cgroup/net_prio/iscsi/net_prio.ifpriomap

上述指令将強制設定任何源于iscsinet_priocgroup程序的流量和eth0網絡接口傳出的流量的優先級為5。父cgroup也有可寫入的net_prio.ifpriomap檔案,可以設定系統預設優先級。

繼續閱讀