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系统,这个函数里才会真正分配巨页。

转载请注明!!

猜你喜欢

转载自blog.csdn.net/wdjjwb/article/details/80814512
今日推荐