本文作爲cgroup內核代碼的開篇文檔,只介紹cgroup的設計理念,不介紹具體代碼。理解了本文即理解了cgroup的核心思想,可以更容易地理解其它cgroup的源碼分析文章。文中出現的內核源碼來源於4.14.4版本。
一、資源的樹型管理
CGROUP是擁有共同資源屬性的任務的集合,用來控制一組任務擁有多少資源可用。內核中有多種資源(稱爲子系統,參考struct cgroup_subsys和參考struct cgroup_subsys_state),這些資源絕大多數是可數、可分配的,因此CGROUP V1版本中是以層次樹(也叫hierarchy)的方式來進行管理。因爲樹的子樹或子節點(參考struct cgroup)屬性可以體現資源的包含或子集關係。比如根節點擁有全部的資源上限(如內存2G),子節點擁有部分的資源上限(如內存1G)。任務掛到哪個節點上,就有相應的資源控制屬性。
爲了簡化或者減少數據結構,可以把多個資源放到一顆樹上進行管理,因此cgroup這個對象可以同時管理多個資源(subsys),可以看到它有一個cgroup_subsys_state數組成員用來保存這個節點中的多種資源當時的狀態。
二、統計任務資源
當一個任務分配資源(如內存malloc後產生的缺頁)時,需要把分配的資源統計到cgroup的節點上。因此需要從task_struct對象訪問到cgroup_subsys_state狀態對象。task_struct的cgroups成員(css_set對象,即資源狀態的集合對象)保存了和這個任務相關的所有cgroup_subsys_state狀態的數組。這樣,每個任務消費了資源,就可以通過該成員進行統計。
但是每個任務的cgroup成員所指向的css_set對象是不同的。有的任務限制CPU,有的任務限制內存。只有那些有相同限制類別的任務會指向相同的css_set對象(比如某容器內的task通常指向同一個css_set對象)。
三、從cgroup獲取任務列表
反過來,當需要從cgroup來遍歷它裏面的task的需求。一種方式是把擁有相同資源層次樹hierarchy的任務都鏈接到cgroup上。但是任務有可能同時存在於多個hierarchy中(擁有多種資源)。在task_struct中增加一個list_head不夠,增加多個list_head不現實。因此一個任務可能存在多個cgroup中(不同hierarchy),一個cgroup又有多個任務。task和cgroup是多對多的關係。對於這種多對多關係的對象,可以設計一種中間結構體A,當某task和某個cgroup進行匹配時,就創建一個A對象。A對象分別指針指回關聯的task和cgroup。在cgroup中將和它相關的A對象鏈接起來,遍歷這個鏈表,就可以遍歷在該group中的所有task。如果某task T在兩個cgroup中,則有兩個A對象分別指向T,這兩個A對象分別鏈入兩個cgroup的鏈表。這樣兩個cgroup能夠遍歷訪問到不同的A對象和T。
實際上內核設計將上述思想做了進一步的優化。由於多個任務擁有一個公共的css_set對象上,因此內核就將任務鏈入css_set的task鏈表(css_set的tasks成員)。而讓css_set與cgroup形成多對多的關係,因此css_set和cgroup是一個多對多的關係。struct
cgrp_cset_link就css_set與cgroup多對多匹配的中間結構。採用css_set(比採用task)與cgroup進行匹配,可以減少很多中間結構。css_set與cgroup的多對多的關係圖,請參考我的另外一篇文章(http://blog.csdn.net/lovelycheng/article/details/78359991)。從cgroup遍歷task時,先遍歷中間的cgrp_cset_link對象,然後通過cgrp_cset_link訪問相關的css_set對象,然後再遍歷css_set的所有task。
四、cgroup V2
可以看到,CGROUP V1的多層hierarchy的支持,是css_set與cgroup多對多關係以及cgrp_cset_link的複雜性根源。因此在4.X的內核版本,社區實現了一個unified
hierarchy(只有一個層級的hierarchy)的簡化版的CGROUP V2。
【CGROUP】10分鐘深入理解CGROUP V1本質
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
Linux進程:Linux切換機制主流程
qixuan.wu
2018-08-25 16:15:53
中斷,異常,系統調用,進程切換時的堆棧變化和寄存器保存
qixuan.wu
2018-08-25 16:15:51
《Linux內核情景分析》經典解說--進程
qixuan.wu
2018-08-25 16:15:51
【安全】10分鐘理解Capability本質
qixuan.wu
2018-08-25 16:15:53
內核的幾種內存分配與線性映射方式
qixuan.wu
2018-08-25 16:15:53
【內存】高端內存映射
qixuan.wu
2018-08-25 16:15:53
【CGROUP】10分鐘深入理解cgroup與css之間的多對多的關係
qixuan.wu
2018-08-25 16:15:59