Docker之cgroup介紹

1 cgroup基本介紹

1.1 cgroup基本概念

cgroups(ControlGroups)是內核提供的一種機制,爲了不同用戶層面的資源管理,提供一個統一化的接口。從單個進程的資源控制到操作系統層面的虛擬化。

1.2 cgroup術語表

task(任務):cgroups的術語中,task就表示系統的一個進程。
cgroup(控制組):cgroups中的資源控制都以cgroup爲單位實現。cgroup表示按某種資源控制標準劃分而成的任務組,包含一個或多個子系統。一個任務可以加入某個cgroup,也可以從某個cgroup遷移到另外一個cgroup。
subsystem(子系統):cgroups中的subsystem就是一個資源調度控制器(ResourceController)。比如CPU子系統可以控制CPU時間分配,內存子系統可以限制cgroup內存使用量。
hierarchy(層級樹):hierarchy由一系列cgroup以一個樹狀結構排列而成,每個hierarchy通過綁定對應的subsystem進行資源調度。hierarchy中的cgroup節點可以包含零或多個子節點,子節點繼承父節點的屬性。整個系統可以有多個hierarchy。

1.3 cgroup主要功能

1.3.1資源限制(ResourceLimitation)

cgroups可以對進程組使用的資源總額進行限制。如設定應用運行時使用內存的上限,一旦超過這個配額就發出OOM(OutofMemory)。

1.3.2優先級分配(Prioritization)

通過分配的CPU時間片數量及硬盤IO帶寬大小,實際上就相當於控制了進程運行的優先級。

1.3.3資源統計(Accounting)

cgroups可以統計系統的資源使用量,如CPU使用時長、內存用量等等,這個功能非常適用於計費。

1.3.4進程控制(Control)

cgroups可以對進程組執行掛起、恢復等操作。

1.4 cgroup子系統

如圖所示,cgroup的子系統主要包括blkio、cpu、cpuacct、cpuset、devices、freezer、memory、perfevent等系統,基本經常使用的就是blkio、cpu、memory、cpuset。簡單介紹一下這些常用的子系統的各個字段。

1.4.1 blkio-資源控制

(1)按比例分配塊設備IO資源

blkio.weight:填寫100-1000的一個整數值,作爲相對權重比率,作爲通用的設備分配比。
blkio.weight_device:針對特定設備的權重比。

(2)控制IO讀寫速度上限

blkio.throttle.read_bps_device:按每秒讀取塊設備的數據量設定上限,格式device_types:
node_numbersbytes_per_second。
blkio.throttle.write_bps_device:按每秒寫入塊設備的數據量設定上限,格式device_types:
node_numbersbytes_per_second。
blkio.throttle.read_iops_device:按每秒讀操作次數設定上限,格式device_types:
node_numbersoperations_per_second。
blkio.throttle.write_iops_device:按每秒寫操作次數設定上限,格式device_types:
node_numbersoperations_per_second。

(3)針對特定操作

blkio.throttle.io_serviced:針對特定操作按每秒操作次數設定上限,格式
device_types:node_numbersoperation_per_second。
blkio.throttle.io_service_bytes:針對特定操作按每秒數據量設定上限,格式device_types:node_numbersoperationbytes_per_second。

1.4.2 cpu-資源控制

(1)CFS調度策略下的配置

cpu.cfs_period_us:設定週期時間,必須與cfs_quota_us配合使用。
cpu.cfs_quota_us :設定週期內最多可使用的時間。這裏的配置指task對單個cpu的使用上限,若cfs_quota_us是cfs_period_us的兩倍,就表示在兩個核上完全使用。數值範圍爲1000-1000,000(微秒)。
cpu.stat:統計信息,包含nr_periods(表示經歷了幾個cfs_period_us週期)、nr_throttled(表示task被限制的次數)及throttled_time(表示task被限制的總時長)。
cpu.shares:設定一個整數(必須大於等於2)表示相對權重,最後除以權重總和算出相對比例,按比例分配CPU時間。(如cgroupA設置100,cgroupB設置300,那麼cgroupA中的task運行25%的CPU時間。對於一個4核CPU的系統來說,cgroupA中的task可以100%佔有某一個CPU,這個比例是相對整體的一個值)。

(2)RT調度策略下的配置

實時調度策略與公平調度策略中的按週期分配時間的方法類似,也是在週期內分配一個固定的運行時間。
cpu.rt_period_us :設定週期時間。
cpu.rt_runtime_us:設定週期中的運行時間。

1.4.3 cpuacct-資源報告

cpuacct.usage:統計cgroup中所有task的cpu使用時長。
cpuacct.stat:統計cgroup中所有task的用戶態和內核態分別使用cpu的時長。
cpuacct.usage_percpu:統計cgroup中所有task使用每個cpu的時長。

1.4.4 cpuset-cpu綁定

cpuset.cpus:在這個文件中填寫cgroup可使用的CPU編號,如0-2,16代表0、1、2和16這4個CPU。
cpuset.mems:與CPU類似,表示cgroup可使用的memorynode,格式同上。

1.4.5 memory-內存資源管理

(1)限額類

memory.limit_bytes:強制限制最大內存使用量,單位有k、m、g三種,填-1則代表無限制。
memory.soft_limit_bytes:軟限制,只有比強制限制設置的值小時纔有意義。填寫格式同上。當整體內存緊張的情況下,task獲取的內存就被限制在軟限制額度之內,以保證不會有太多進程因內存捱餓。可以看到,加入了內存的資源限制並不代表沒有資源競爭。
memory.memsw.limit_bytes:設定最大內存與swap區內存之和的用量限制。填寫格式同上。

(2)報警與自動控制

memory.oom_control:該參數填0或1, 0表示開啓,當cgroup中的進程使用資源超過界限時立即殺死進程,1表示不啓用。默認情況下,包含memory子系統的cgroup都啓用。當oom_control不啓用時,實際使用內存超過界限時進程會被暫停直到有空閒的內存資源。

(3)統計與監控類

memory.usage_bytes:報告該cgroup中進程使用的當前總內存用量(以字節爲單位)。
memory.max_usage_bytes:報告該cgroup中進程使用的最大內存用量。
memory.failcnt:報告內存達到在memory.limit_in_bytes設定的限制值的次數。
memory.stat:包含大量的內存統計數據。

#1.5 cgroup安裝及常見命令

1.5.1 不同環境安裝命令

(1)Centos系統

yum -y install libcgroup-tools.x86_64

(2)ubuntu系統

sudo apt-get install cgroup-bin

(3)安裝完成後在 /sys/fs目錄下生成/cgroup目錄

1.5.2 常見命令

cgclassify -- cgclassify命令是用來將運行的任務移動到一個或者多個cgroup。
cgclear -- cgclear 命令是用來刪除層級中的所有cgroup。
cgconfig.conf -- 在cgconfig.conf文件中定義cgroup。
cgconfigparser -- cgconfigparser命令解析cgconfig.conf文件和並掛載層級。
cgcreate -- cgcreate在層級中創建新cgroup。
cgdelete -- cgdelete命令刪除指定的cgroup。
cgexec -- cgexec命令在指定的cgroup中運行任務。
cgget -- cgget命令顯示cgroup參數。
cgred.conf -- cgred.conf是cgred服務的配置文件。
cgrules.conf -- cgrules.conf 包含用來決定何時任務術語某些 cgroup的規則。
cgrulesengd -- cgrulesengd 在 cgroup 中發佈任務。
cgset -- cgset 命令爲 cgroup 設定參數。
lscgroup -- lscgroup 命令列出層級中的 cgroup。
lssubsys -- lssubsy

當然也可以用mkdir和rmdir代替cgcreate和cgdelete,也可以用腳本echo+重定向的方式代替cgset等,命令不唯一。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章