UKSM & KSM在Android上的表現

作爲一個系統管理程序(hypervisor),Linux® 有幾個創新,2.6.32 內核中一個有趣的變化是 KSM(Kernel Samepage Merging) 允許這個系統管理程序通過合併內存頁面來增加併發虛擬機的數量。Linux UKSM 是國人自主研發的一個 Linux 內核相關項目,這個項目對服務器和桌面應用都可以顯著的減少 Linux 系統冗餘的內存,已經在 RHEL6、CentOS 6、Ubuntu 12.04 等系統充分驗證和測試過。Linux相同頁面合併機制(KSM)使得內存中相同的頁面,可以通過修改頁表的方式合併成一個。通常這個機制被應用在有衆多虛擬機(目前僅支持 KVM)或者有很多冗餘內存數據的場景(如有很多類似數據工作集的並行科學計算)裏面。但是,目前它的實現方式仍然比較簡陋,UKSM的出現,徹底消除了KSM原本侷限,真正使得這項技術能被更多的普通用戶使用。
衆所周知,Android 內核衍生自Linux,但因平臺特性,Android Kernel與 Linux Kernel演變出分歧,KSM和UKSM是意在解決內存冗餘佔用問題開發出的兩個內核模塊,他們在安裝運行多個虛擬機宿主Host上表現相當出色。尤其是UKSM,較於KSM,有較高的性能、透明度和安全性,被廣大Kernel內核開發人員和大型服務器用戶所青睞。
我們的產品內存有限,合併冗餘的內存佔用,從內存優化的角度出發,KSM和UKSM無疑是比較好的選擇。以下我們針對KSM和UKSM的表現作出測試,以作爲UKSM和KSM是否登錄產品的決策依據。
說明:KSM在Android Kernel 3.10時代就已經集成,內核開關爲 CONFIG_KSM,依賴開關爲CONFIG_MMU,UKSM爲國人解決服務器冗餘內存佔用研發,可供參考的版本爲0.1.2.3-for-v3.1 ~~~0.1.2.5-for-v3.18。

測試條件:
1.機型:(1G RAM/ MT6580);
2.平臺:Android 7.1;
3.內核:Kernel 3.18
測試步驟:
測試機在內核中集成uksm模塊,對比機關閉uksm模塊,打開ksm開關,使用原生ksm模塊做內存合併。測試機與對比機測試方法相同。正常開機開始統計數據(ksm和uksm守護進程CPU佔用、整機內存剩餘佔用),開機手機靜置10min,隨即開始使用native應用test.bin進行內存申請和填充 “test 200 1”,申請200M內存,整塊內存區域使用’1’填充,等待兩分鐘後重復申請填充,第4分鐘同上,等待2分鐘,終止數據抓取腳本。
測試原理:
測試機器在正常運行過程中,ksm/uksm對內存合併的積極性、合併效率(內存曲線展示)以及在此過程中的cpu開銷(top數據體現)。

數據分析:
16min測試中對比機(ksm)和測試機(uksm)的內存波動。分析,在手機靜置的10min中,uksm合併不如ksm積極,現象是在此過程中整機內存uksm略少於ksm,這一值約爲30~40M。分別在10min、12min和14min時由test發起的內存申請可以看出,uksm對此200M內存的合併速度遠遠快於ksm,即uksm遍歷合併完成200M內存耗時16s,而ksm完成此過程需要平均60s。
合併動作發生時的內存波動,可以直觀展示合併效率
下面是top -m 50 中的ksmd/ukamd信息,可以看出uksm對CPU的利用率非常高,而就內存頁檢測而言,cpu佔用穩定在1%一下,而此數據在ksmd上爲均值26%,而且整機運行過程中,ksmd的cpu佔用持續高波動,對功耗產生的壓力較大。
這裏寫圖片描述

這項數據表明,UKSM在Android上的表現確實優於KSM,無論從速度還是CPU資源消耗的角度。但是在小內存設備上並沒有什麼優勢,親測:累死累活得合併10~15M內存,功耗上來了,犯不着費這個勁,指着大內存設備上驗證是否有用,畢竟國內的牛人當初整出來UKSM就是針對虛擬機服務器這種使用場景。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章