khugepaged 是 Linux 内核中的一个后台守护进程(内核线程)。
它的核心职责是自动将进程内存中原本分散的、大小为 4KB 的普通内存页,合并成大小为 2MB 的“大页”。这个过程在技术上被称为“折迭”。
它为什么要这么做?
主要目的是为了提升系统的内存访问性能。
计算机的 CPU 中有一个负责转换地址的缓存叫 TLB(快表)。它的空间很小,能存储的地址映射关系有限。如果使用 2MB 的大页,一个 TLB 条目就能覆盖原来 512 个 4KB 小页的内存区域。这意味着 CPU 能更快地找到需要的数据,减少在 TLB 缓存中查找不到目标(缓存未命中)的情况,从而让内存读写更快,尤其对消耗大量内存的应用(如数据库、虚拟机)有明显好处。
它具体是怎么工作的?
你可以把它想象成一个内存空间的“整理师”:
定期巡检:它会在后台周期性地醒来,主动去扫描系统中各个进程正在使用的内存区域。
寻找目标:它专门寻找那些可以被“拼凑”成大页的区域。理想的目标是那些已经连续、稳定、并且被应用程序频繁读写的内存数据。
执行合并:一旦找到合适的地方,它会尝试分配一块连续的 2MB 物理内存,然后把原来分散在多个 4KB 页面里的数据复制进去。如果复制成功,原来的那些小页就会被系统回收,整个过程对正在运行的应用程序是基本透明的。
如何理解它的存在意义?
利用碎片,变废为宝:系统运行久了,内存可能会变得碎片化。当应用程序启动时需要大页,可能因为碎片而无法直接分配。khugepaged 的工作就是在程序运行一段时间后,通过整理现有的内存,把那些分散的、空闲的小页组合成大页,再分配给需要的程序。
后台作业,影响可控:因为它是在后台默默工作,所以它本身也会消耗一点点 CPU 和内存资源。它的工作节奏(比如多久扫描一次、一次扫描多少页)是可以通过系统文件进行调节的。如果对系统延迟要求极高,可以选择让它动作慢一点,或者关闭它的碎片整理功能;如果是普通服务器,让它保持默认状态通常就能带来性能提升。
总的来说,khugepaged 是一个为了提升系统性能而自动运行的“内存整理工”,它默默地把零散的内存页拼凑成更大的页面,让 CPU 能更高效地访问内存。