? ? ? ? Cgroup(Control Group)是內(nèi)核提供的資源隔離的技術(shù),用于對Linux 系統(tǒng)中用戶態(tài)進(jìn)程使用的資源進(jìn)行隔離,核心思想是:把進(jìn)程分組,然后為進(jìn)程組分配資源(包括內(nèi)存、CPU、IO等)。其中Mem Cgroup用來隔離進(jìn)程組使用的內(nèi)存資源。 ? ? ? ? 在Hadoop集群
? ? ? ? Cgroup(Control Group)是內(nèi)核提供的資源隔離的技術(shù),用于對Linux 系統(tǒng)中用戶態(tài)進(jìn)程使用的資源進(jìn)行隔離,核心思想是:把進(jìn)程分組,然后為進(jìn)程組分配資源(包括內(nèi)存、CPU、IO等)。其中Mem Cgroup用來隔離進(jìn)程組使用的內(nèi)存資源。
? ? ? ? 在Hadoop集群中,我們使用了Mem Cgroup對MapReduce任務(wù)使用的內(nèi)存資源進(jìn)行隔離控制,以保證單個(gè)任務(wù)不能占用太大的內(nèi)存,進(jìn)而保證整個(gè)系統(tǒng)的穩(wěn)定性。同時(shí)我們配置了release_agent,用于在mem cgroup中的所有進(jìn)程退出后清理相關(guān)的資源。
? ? ? ? 但Mem Cgroup在Hadoop集群上線后,經(jīng)常會(huì)出現(xiàn)某個(gè)Mem Cgroup中的進(jìn)程已經(jīng)全部退出,但對應(yīng)的Cgroup目錄清理不掉的現(xiàn)象。查看Cgroup的狀態(tài),有如下現(xiàn)象:
? ? ? ? [root@]# cat /cgroup/memory/test/tasks
? ? ? ? [root@]# cat /cgroup/memory/test/memory.usage_in_bytes
? ? ? ? 90112
? ? ? ??該cgroup的所有進(jìn)程確實(shí)都已經(jīng)退出了,但還是存在部分內(nèi)存處于被使用狀態(tài),這是神馬情況,下意識地想到,難道是Page Cache,果斷驗(yàn)證下:
? ? ? ? echo 3 > /proc/sys/vm/drop_caches
? ? ? ? 刷掉Page Cache之后,殘留的cgroup目錄竟然成功被清理了,?那基本斷定是Page Cache的影響了,后面就得分析下代碼,研究下其中的原理了。
? ? ? ? 經(jīng)過幾天的分析,終于把Mem Cgroup的基本原理搞明白了。
? ? ? ? 在Linux內(nèi)核中,每個(gè)Mem Cgroup都對應(yīng)一個(gè)mem_cgroup結(jié)構(gòu),該結(jié)構(gòu)的的核心是res_counter,記錄了資源使用情況和資源限制,每個(gè)mem cgroup對象都包含一個(gè)與之關(guān)聯(lián)的res_counter。
? ? ? ? ?Linux內(nèi)核管理內(nèi)核的基本單位是頁面,采用page結(jié)構(gòu)管理,一個(gè)物理頁框?qū)?yīng)著一個(gè)page結(jié)構(gòu),與此同時(shí),新增了一個(gè)page_cgroup結(jié)構(gòu),用來關(guān)聯(lián)page和mem_cgroup,這樣給定任何一個(gè)頁面,都可以找到對應(yīng)的mem_cgroup。另外,每個(gè)進(jìn)程都有一個(gè)mm_struct結(jié)構(gòu)來管理進(jìn)程的內(nèi)存信息。每個(gè)mm_struct知道自己屬于的進(jìn)程,進(jìn)而可以知道進(jìn)程所屬的mem_cgroup。
??
? ? ? ? 用戶進(jìn)程物理內(nèi)存的分配基本都是通過page_fault來實(shí)現(xiàn),現(xiàn)在來看下這個(gè)過程中是如何實(shí)現(xiàn)mem cgroup相關(guān)功能的,page_fault的大體流程如下:
? ? ? ?1、? 根據(jù)current進(jìn)程找到對應(yīng)的mm_struct結(jié)構(gòu)
? ? ? ?2、? 分配需要的page頁面
? ? ? ?3、? 調(diào)用mem_cgroup_newpage_charge:該函數(shù)根據(jù)mm struct查找到對應(yīng)的mem_cgroup,然后? ? ? ??? ? ? ??? ? ? ? ? ? ? ??判斷下當(dāng)前mem_cgroup是否已經(jīng)超過限制,如果沒有,則把新分配page對應(yīng)page_cgroup指向該mem_cgroup,并更新資源使用計(jì)數(shù)。如果已經(jīng)超過了限制,則進(jìn)行oom相關(guān)的處理。
? ? ? ? 現(xiàn)在來考慮下Page cache,這些內(nèi)存是系統(tǒng)級的,可以被所有進(jìn)程使用,那這些內(nèi)存的使用算在哪個(gè)進(jìn)程的頭上呢?mem cgroup采用的是first touch的原則,就是說哪個(gè)進(jìn)程把page cache頁面“帶進(jìn)”內(nèi)存,這個(gè)頁面就算在誰的頭上。
? ? ? ? 大致了解了Mem cgroup的原理,回到一開始的問題,雖然mem cgroup中的進(jìn)程都已經(jīng)退出了,但是這些進(jìn)程使用的page cache仍然計(jì)算在這個(gè)mem cgroup中,導(dǎo)致mem cgroup一直被引用,因此mem cgroup清理不掉,刷掉page cache后,mem cgroup就沒有被引用了,也就可以清理了。
? ? ? ? 針對該問題,我們在內(nèi)核新增加了一個(gè)page cache的使用計(jì)算選擇:把page cache全部算入默認(rèn)的根mem cgroup。這樣做的另外一個(gè)好處是,mem cgroup只記錄進(jìn)程本身利用的物理內(nèi)存,更直觀可控。同時(shí)page cache是可回收的,如果某個(gè)mem cgroup中的進(jìn)程產(chǎn)生大量的page cache時(shí),其他mem cgroup進(jìn)程的內(nèi)存基本不受影響,可能的壞處是影響其他mem cgroup內(nèi)存分配的效率。
? ? ? ? 參考:http://lwn.net/Articles/432224/
你也許會(huì)喜歡:
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com