Cgroup框架分析

2021-07-06 06:26:06 字數 2781 閱讀 3935

cgroups框架中涉及了大量的結構體,並且嵌入了很多list_head以及hlist_node等資料結構,目的是將這些資料結構鏈結在一起,無論從任何乙個結構體出發都可以很好的找到自己想要的目標結構體,因此核心中也出現了大量的短小精悍的inline funtion,這些function基本只有一兩句話,核心的語句就是通過list_head或者hlist_node找到目標鏈結的結構體。核心中更有甚者會給兩個概念上是多對多的這樣關係的結構體專門抽象出乙個單獨的結構體嵌入list_head實現兩個結構體的多對多關係,cgroup中就有這樣的例子。

struct task_struct,這是程序描述符的結構體,和cgroup相關的則是其中struct css_set *cgroup成員,以及struct list_head cg_list成員struct css_set這是個啥東東呢css的全稱為cgroup subsystem state,也就是cgroup子系統的狀態,set很自然就是集合的意思了,所以css_set維護了一組子系統的狀態所以呢css_set中核心的成員就是struct cgroup_subsys_state[cgroup_subsys_count],乙個子系統對應乙個這樣的結構體,好吧那就繼續分析下這個結構體吧,struct cgroup_subsys_state對於這個結構體來說,裡面有這個子系統對應的cgroup,這個子系統引用的次數,乙個子系統如果使用了,那麼肯定是屬於乙個cgroup的,所以這個結構體中最核心的成員應該是struct cgroup *cgroup,很顯然struct cgroup就是乙個cgroup組,如果不知道什麼是cgroup中組或者是層次的概念,請看附錄a或b中提到的文章,好了現在乙個子系統對應乙個cgroup,那麼現在來看看struct cgroup是個啥啥,struct cgroup 首先會指向一組子系統,因為乙個cgroup可以對應多個子系統,其次,乙個cgroup應該維護層次關係,應該可以找到其兄弟cgroup,父cgroup等資訊,所以cgroup中含有struct list_head children,struct list_head sibling還有struct cgroup cgroup,還應該有個啥呢?cgroup的name,所以就有了*struct cgroup_name __rcu *name這個成員,還應該有個指標指向cgroupfs檔案系統,因為建立乙個cgroup會在對應的cgroupfs檔案系統中建立一系列的檔案,所以就有了乙個struct cgroupfs_root *root成員,struct cgroup_name 就是乙個char陣列,加上乙個鎖,這個部分核心成員應該算是cgroupfs_root吧,好了到此為止吧,再往下分析我怕我收不住。總結一下就是結構體中的成員以及結構體之間的關於和cgroup的基本概念息息相關,所以在掌握cgroup的基本概念的前提下去分析cgroup框架是必經之路。cgroup框架還不僅僅是這些,下面會繼續挖掘cgroup中結構體之間的深層次關係。

從上面的這幅圖可以看出,通過task_struct可以找到乙個css_set,這是乙個子系統狀態的集合,裡面有cgroup_subsys_state,所以,通過task_struct來找到這個程序附加在哪些子系統中,受到哪些子系統的限制,通過cgroup_subsys_state子系統狀態結構體又可以找到這個子系統屬於哪個cgroup,所以通過css_set建立了task_struct和cgroup_subsys 以及task_struct和cgroup的一對多的關係。同時核心為了方便查詢css_set,將所有的css_set建立了乙個hash table 通過子系統可以快速找到子系統對應的狀態,也就是cgroup_subsys_state,注意看下task_struct的cg_list成員,這個成員將所有具有相同css_set的程序連線起來,好吧,這一切都是為了快速查詢,核心可謂之用心良苦啊。

css_set和cgroup是什麼樣的關係呢,核心為了清晰的表達出這兩者的關係可謂之用心良苦,專門設計了乙個結構體來表現其多對多的關係cg_cgroup_link,乙個css_set對應多個子系統,每個子系統都有其對應的cgroup,所以乙個css_set對應多個cgroup,反之,乙個cgroup可能包含多個子系統,而多個子系統可能分開存在於多個css_set集合中,所以乙個cgroup就對應多個css_set了

好吧,到此為止核心完美的呈現了這些資料結構直接的關係。最後來張大集合。

這張是cgroup涉及到的一些 結構體,以及這些結構體之間的關係,可見關係還是很複雜的,其中cgroup_subsys很重要,這是乙個抽象類,每乙個子系統都會去例項化這樣的乙個結構體,然後實現其中的一些方法,比如附加子系統,對子系統中的資料讀寫,等等一系列的操作,cgroupfs_root則是表示的是乙個層次,很顯然這個結構體應該將所有層次連線起來,以及所有的子系統連線起來,所以你會看到圖中有roo_list和subsys_list兩個鍊錶。到此為止整個cgroup的框架其實以及很清楚了。

總結: cgroup總體框架的**不難,難的是這些結構體的複雜關係。

redhat resource manager document

cgroup基本入門

cgroup基本使用

cgroup使用高階

cgroup初步分析(1)

cgroup的功能和作用不廢話,直說一下cgroup的幾條設計準則,有了幾條設計準則的約束,就比較容易理解其中的資料結構和函式,至於源 cgroup.c,無非是兩個內容,一是task struct cgroup css set三個資料結構互相關聯,而是cgroup檔案系統的實現。先看設計準則 問題1...

cgroup從入門到懵圈 cgroup概念

從今天起,我要開始寫部落格了。先立個flag在這兒 兩周一篇。萬事開頭難,中間不容易,最後會放棄。請各位看官監督 雖然似乎肯定沒有人看 之前有接觸過cgroup,但東西都是同事在做 羨慕 理解不深。所以這個系列的文件,我假裝自己是cgroup菜雞 其實我不需要假裝 從零開始學習cgroup。cgro...

CGROUP相關知識

安裝 centos 6 yum install libcgroupcentos 7 yum install libcgroup tools預設情況下有幾個控制器可以進行限制,分別是 限制cpu負載 我寫了乙個指令碼來消耗cpu count.sh bin bash n 0while true do n...