容器學習筆記之CPU Cgroup

2021-10-11 05:31:54 字數 2269 閱讀 2007

我們知道,cgroups可以限制容器資源,比如cpu、memory、storage、network等。

最近學習了cpu cgroup中三個重要的引數:cpu.cfs_quota_us,cpu.cfs_period_us和cpu.shares。在說明這幾個引數的意義和作用之前,先了解一下cpu各種狀態。

我們通過top命令檢視系統中的cpu占用情況,如下圖:

top結果中,紅框框起來的一行包括us,sy,ni,id,wa,hi,si,st這些字元,這些都是什麼意思呢?具體含義,看下面這張表(來自極客時間,李程遠,《容器實戰高手課》):

us是user的縮寫,代表linux的使用者態cpu usage,我們編寫的程式**中,只要不是呼叫系統函式,那麼這些**指令消耗的cpu就都屬於us。

sy是system的縮寫,表示核心態的cpu usage。如果程式**中呼叫了系統函式,比如用read()去讀取乙個檔案,那麼程序就會從使用者態切換到核心態,在真正去磁碟上讀取檔案之前,會先進行一些檔案系統層的操作,這個階段,**指令執行屬於sy。

id是idle的縮寫,當使用者程式執行完乙個任務後,如果當前這個cpu沒有其他任務需要做,就進入空閒狀態了,也就是idle狀態。

wa是iowait的縮寫,代表等待i/o的時間,例如上面說的讀取檔案過程中,真正的磁碟讀取操作是task_uninterruptible的,等待這個disk i/o的時間,就是wa。

hi是hardware irq的縮寫,代表cpu處理硬中斷的開銷。

si是softirq的縮寫,代表cpu處理軟中斷的開銷。hi和si的cpu時間都不計入程序的cpu時間,因為它們本身在處理的時候就不屬於任何乙個程序。

ni是nice的縮寫,如果程序的nice值是正值(1-19),代表優先順序比較低的程序執行時所占用的使用者態cpu時間。

st是steal的縮寫,屬於虛擬機器裡使用的乙個cpu使用型別,表示有多少時間是被同乙個宿主機上的其他虛擬機器搶占的。

好了,回到cpu cgroup。cpu cgroup是cgroups的乙個子系統,用來限制cpu的使用。cpu cgroup只會限制使用者態(us和ni)和核心態(sy)cpu的使用,而不會去限制wa、hi和si等i/o或中斷相關的cpu使用。

每個cgourps子系統都是通過乙個虛擬檔案系統掛載點的方式,掛載到乙個預設目錄下,linux系統中,cpu cgroup一般放在/sys/fs/cgroup/cpu目錄下。

在該目錄下,每個控制組都是乙個子目錄,各控制組之間的關係就是乙個樹狀層級關係。比如我們這個目錄下,進入到docker目錄,看到的目錄圖如下:

在該子目錄下,又包括不同的容器目錄,例如我們進入到其中的乙個容器目錄:

在普通排程(sched_normal)型別程序中,排程演算法是cfs(completely fair scheduler,即完全公平排程器)。cpu cgroup和cfs相關的引數,共有三個,也就是我們在本篇開頭提到的三個引數:cpu.cfs_period_us,cpu.cfs_quota_us,和cpu.shares。

cpu.cfs_period_us是cfs演算法的乙個排程週期,一般它的值是100000us,即100ms。

cpu.cfs_quota_us表示在cfs演算法中,在乙個排程週期裡該控制組被允許的執行時間,比如這個值為50000時,就是50ms。用這個值去除以排程週期cpu.cfs_period_us,即50ms/100ms=0.5,得到的值表示該控制組被允許使用的cpu最大配額是0.5個cpu。在我的系統裡,這個值是-1,為預設值,表示不限制。

cpu.shares用於控制不同控制組之間的cpu分配比例,預設值是1024,表示1個cpu。如果在樹狀結構的同一層中,乙個控制組的cpu.shares是1024,另乙個控制組的cpu.shares是3072,那麼這兩個控制組的cpu分配比例就是1:3。但這個值只有在系統上的cpu完全被佔滿的時候,才會起作用,在沒有跑滿的時候,各控制組仍然是按照cpu.cfs_quota_us與cpu.cfs_period_us比值所得到的cpu絕對值去執行的。

好了,說到這裡,我們對如何限制容器cpu的使用已經有了乙個大概的認識。更多學習筆記,稍後更新......

C 學習筆記之容器

list 和 vector 2者都屬於容器,但list只有雙向迭代器,而vector卻有隨機訪問迭代器 迭代器的種類 前向迭代器 forward iterator 可對迭代器進行 操作雙向迭代器 bidirectional iterator 可對迭代器進行 和 操作隨機訪問迭代器 random ac...

學習筆記之 Iterator 容器與容器遍歷

color red 容器 color 就是能夠容納其他元素這樣的物件叫著容器,也就是說 容器也是乙個物件 我們想寫乙個容器的話 可以用陣列或者鍊錶來模擬乙個容器 它應該具備乙個add方法,用陣列模擬容器和陣列直接裝東西相比,好處就是不用在考慮陣列邊界的問題了可以動態增長,想往裡頭裝東西直接裝就是了 ...

STL學習筆記之容器 slist

slist是sgi stl裡面的乙個單向鍊錶,不過這個不屬於標準定義,所以,g 下面不能用,另外看了下vs2008裡面也沒有。不過看到書上這一部分講解,還是配合sgi的 做乙個了解。一般情況下使用標準的list就可以滿足要求了,而且會更加方便,list的分析可以參考stl筆記之list一文。因為sl...