天天看點

Linux cgroup資源隔離各個擊破之 - cpu隔離1

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 務必 &gt;= 2

cpu.shares隻限制了使用下限,如果同時還需要設定cpu使用上限,可以通過以下兩個參數來設定。

如果分組中的任務在周期cpu.cfs_period_us内使用的cpu時間超過了cpu.cfs_quota_us,則進入抑制狀态,并且需要等下一個周期才能繼續使用cpu。

例子,周期為1秒,允許使用4秒cpu時間。(假設cpu&gt;=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子分區和子系統

如何檢視程式設定的排程政策

設定排程政策的接口

繼續閱讀