linux cgroup 有兩個子系統支援cpu隔離。
一個是cpu子系統,另一個是cpuset子系統。
.1. 完全公平排程 completely fair scheduler (cfs)
原理詳見
<a href="https://www.kernel.org/doc/documentation/scheduler/sched-design-cfs.txt">https://www.kernel.org/doc/documentation/scheduler/sched-design-cfs.txt</a>
cfs用于處理以下幾種程序排程政策
sched_other
sched_batch
sched_idle
.2. 實時排程 real-time scheduler (rt)
<a href="https://www.kernel.org/doc/documentation/scheduler/sched-rt-group.txt">https://www.kernel.org/doc/documentation/scheduler/sched-rt-group.txt</a>
rt用于處理以下幾種程序排程政策
sched_fifo
sched_rr
cfs排程針對屬性為sched_other, sched_batch, sched_idle的程序。
限制手段分為兩方面,
.1. 限制資源組的cpu使用硬上限,
.2. 以及資源組的cpu使用權重。
cfs排程資源組内的任務在cpu空閑時超權重使用cpu資源,但是不能超過硬上限。
例子
cfs保證了groupa的程序能使用25%的cpu資源,groupb的程序能使用75%的cpu資源。
如果cpu較空閑,groupa的程序能使用超過25%的cpu資源。
如果又加了個groupc進來,并且配置了cpu.shares = 250,那麼cpu資源将在三個group之間重配置設定。
注意 cpu.shares 務必 >= 2
cpu.shares隻限制了使用下限,如果同時還需要設定cpu使用上限,可以通過以下兩個參數來設定。
如果分組中的任務在周期cpu.cfs_period_us内使用的cpu時間超過了cpu.cfs_quota_us,則進入抑制狀态,并且需要等下一個周期才能繼續使用cpu。
例子,周期為1秒,允許使用4秒cpu時間。(假設cpu>=4核心,表示這個組在一個使用周期(1s)内可以跑滿4核資源)
rt排程針對屬性為sched_fifo, sched_rr的程序。
與cfs的quota和period類似,限制了cpu使用的上限。但是rt排程隻限制real-time tasks的cpu使用。
cpu.rt_period_us = 統計cpu使用時間的周期
cpu.rt_runtime_us = 周期内允許任務使用單個cpu核的時間,如果系統中有多個核,則可以使用核倍數的時間 (計算方法與cfs不一樣,需要注意)
既然有抑制狀态和cpu時間片的概念,那就有對應的統計資訊
用來報告該分組内的cpu排程周期,抑制次數,抑制時長等資訊。(注意它的統計不包括子分組的,另外有一個cpuacct的子系統統計資訊包含了子分組的,另一篇文檔會講到)
從統計資訊的抑制時間和抑制次數,可以判斷是否需要給分組增加cpu的上限。
.1.
限制組cgroupa的任務最多可以使用8核資源
限制組cgroupb的任務最多可以使用16核資源
加載cpu子系統,建立子資源分區
配置資源配比(以100為基數,核數乘以100即得到cpu.shares)
運作任務
.1. 限下限
cpu.shares
.2. 限上限
cpu.cfs_period_us
cpu.cfs_quota_us
.3. 限實時任務上限
cpu.rt_period_us
cpu.rt_runtime_us
cpuacct 子系統是用來統計cpu使用情況的子系統,功能定位不是隔離資源,而是統計資源的使用情況。
cpuacct子系統的統計資料包含子分區的。
例如
/cgroup/cpuacct/cg1 包含了 /cgroup/cpuacct/cg1/cg2中所有tasks 的統計資料
/cgroup/cpuacct 包含了 /cgroup/cpuacct/cg1中所有tasks以及/cgroup/cpuacct/cg1/cg2中所有tasks 的統計資料
用法和其他子系統一樣。
統計項
重置統計資訊
核心時鐘的頻率是由config_hz決定的,以前預設是100hz,現在核心預設是250hz。
1個jiffy是1個時鐘滴答,時間間隔是有config_hz決定的,頻率是250hz,也就是周期為4ms。每4ms,增加一個時鐘滴答,也即jiffies++。
擷取config_hz的值(我的系統是1000)
還有一個值是user_hz,times系統調用是統計程序時間消耗的,并且times系統調用的時間機關是由user_hz決定的,是以,times系統調用統計的時間是以10ms為機關的。
說100hz空口無憑,如何擷取user_hz。
擷取 user_hz的值
times系統調用來統計程序資訊我不建議使用了,精度太低了。
提出這個user_hz,隻是希望不要困惑,為什麼config_hz是250,而sysconf(_sc_clk_tck)卻是100.
也即是說,cpuacct統計的cpuacct.stat 并不精确。
參考
<a href="http://blog.chinaunix.net/uid-24774106-id-3877992.html">http://blog.chinaunix.net/uid-24774106-id-3877992.html</a>
比如我給某個組配置設定了4個cpu,那麼如何統計它的cpu使用率呢?
需要建立一個cpuacct組,同時将這些程序劃入cpuacct.
計算方法 :
cpuacct.usage / (1000 cpu.stat.nr_periods cpu.cfs_quota_us)
如果你的環境是這樣的啟動了兩個pg執行個體,并且在一個cpu組限制,如何統計每個pg執行個體的cpu使用率呢?
執行個體1 cpu使用率
rg1: cpuacct.usage / (1000 cpu.stat.nr_periods cpu.cfs_quota_us)
執行個體2 cpu使用率
rg2: cpuacct.usage / (1000 cpu.stat.nr_periods cpu.cfs_quota_us)
如果要限制cpu,同時還需要統計程序的cpu使用資源情況。可以将task同時放到cpu和cpuacct子系統。
(注意rt和cfs的排程政策都要設定,因為你并不知道程式會如何設定它的排程政策。)
清除cgroup子分區和子系統
如何檢視程式設定的排程政策
設定排程政策的接口