1. 程式人生 > >linux 透明巨頁khugepaged 後臺程序分析

linux 透明巨頁khugepaged 後臺程序分析

簡介:
透明巨頁Transparent Hugepage 可以代替以前的hugetlbfs方式。
相關說明可以參考核心Documentation\vm\transhuge.txt文件。

khugepaged :
khugepaged 是透明巨頁的守護程序,它的主要功能是定時喚醒,根據配置嘗試將4k 的普通page轉成2M等巨頁,減少TLB壓力,提高記憶體使用效率。
khugepaged的處理過程中需要各種記憶體鎖,會在一定程度上影響系統性能。
如果有些任務結束,越來越多的大頁面變成可用(無論是立即在夥伴系統或通過虛擬記憶體),常規頁分配的實體記憶體應該通過khugepaged自動遷往大記憶體頁.
khugepaged會處理理那些不使用大記憶體的來處理大量記憶體的應用程式。

關閉該功能:
因為不是所有場景都適合使用透明巨頁,如果配置了透明巨頁,下面2種方式關閉該功能。
1.kernel的啟動引數可以通過傳入transparent_hugepage=never
2.系統啟動後使用echo never > /sys/kernel/mm/transparent_hugepage/enabled

khugepaged 重要的配置引數:
這個可以配置khugepaged 後臺程序一次處理的頁面
/sys/kernel/mm/transparent_hugepage/khugepaged/pages_to_scan

這個可以配置khugepaged 後臺程序喚醒的時間間隔
/sys/kernel/mm/transparent_hugepage/khugepaged/scan_sleep_millisecs

khugepaged 簡單分析:
主要的呼叫鏈如下:
khugepaged -> khugepaged_do_scan-> khugepaged_scan_mm_slot ->
khugepaged_scan_pmd ->collapse_huge_page -> __collapse_huge_page_copy

khugepaged_do_scan 喚醒後,嘗試處理khugepaged_pages_to_scan個頁面。
其中每一次頁面的迴圈這是通過呼叫函式khugepaged_scan_mm_slot完成。
在khugepaged_do_scan每次迴圈的最開始,會嘗試呼叫khugepaged_prealloc_page預分配一個巨頁,需要注意。這主要針對非numa系統,對於numa系統,這裡不會真正分配。

khugepaged_scan_mm_slot函式會掃描struct mm_struct結構體,找到可以用巨頁代替的普通頁面。這裡需要掃描的struct mm_struct是放到全域性變數khugepaged_scan中的mm_slot。而這些mm_slot中的這些mm是在vma結構體發生合併和擴充套件的時候呼叫khugepaged_enter中加入。

khugepaged_scan_mm_slot函式找到需要掃描的mm_struct結構體之後,掃描mm_struct中包含的各個vma,注意,掃描的範圍是一個巨頁包括的範圍。

khugepaged_scan_pmd函式完成普通頁面搬運到巨頁的工作。
具體來說,khugepaged_scan_pmd通過訪問vma中的每一個頁面,然後判斷該頁面是否可以用巨頁代替,可以的話呼叫collapse_huge_page處理

collapse_huge_page函式會呼叫__collapse_huge_page_copy將普通頁面拷貝到巨頁中,然後釋放普通頁面。
不過釋放之前會將原來頁面的tlb刷出去,然後將原來的頁面從LRU連結串列移除,最後拷貝到巨頁中後,還會更新記憶體相關資訊。如果是numa系統,這個函式裡才會真正分配巨頁。

轉載請註明!!