khugepaged 是什么
khugepaged 是透明大页(THP)的后台合并线程:它扫描进程的匿名内存,把连续的 4 KiB 页合并成一个 2 MiB 大页,减少 TLB 缺失、提升大内存应用的访存效率。合并是异步进行的,因此它既是性能优化手段也是抖动来源——合并过程需要拷贝与迁移页面,可能给相关进程带来延迟尖峰,pages_collapsed 的增长速度就是它活跃程度的直接指标。
基本信息
| 线程查看 | ps -eo pid,pcpu,psr,comm | grep khugepaged |
|---|---|
| 核心计数 | /sys/kernel/mm/transparent_hugepage/khugepaged/pages_collapsed |
| 调优文件 | pages_to_scan、scan_sleep_millisecs、alloc_sleep_millisecs、max_ptes_none |
| 全局开关 | /sys/kernel/mm/transparent_hugepage/enabled(always/madvise/never) |
| 权限 | 读取一般开放,写入需 root |
| 生效层级 | 宿主全局参数,容器内改不了宿主的 THP 行为 |
典型使用场景
- 排查偶发延迟尖峰是否与页面合并有关:把 pages_collapsed 增量与业务延迟对齐观察
- 确认 THP 是否真的在工作:只看开关不够,要看到合并计数增长
- 降低空闲时的 CPU 占用:khugepaged 扫描本身消耗 CPU,可调整扫描与睡眠间隔
- 数据库、缓存类应用评估 THP 收益与风险,必要时切到 madvise 模式按需启用
- 判断大页配置是否生效:结合 AnonHugePages 与显式大页配置一起看
观察与调整
观察与调整
ps -eo pid,pcpu,psr,comm | grep khugepaged # 扫描线程的 CPU 占用与所在核
cat /sys/kernel/mm/transparent_hugepage/enabled # always / madvise / never
cat /sys/kernel/mm/transparent_hugepage/khugepaged/pages_collapsed # 累计合并页数,两次采样看增量
cat /sys/kernel/mm/transparent_hugepage/khugepaged/scan_sleep_millisecs # 扫描间隔(毫秒)
cat /sys/kernel/mm/transparent_hugepage/khugepaged/pages_to_scan # 每轮扫描页数上限
grep -E 'AnonHugePages|ShmemPmdMapped' /proc/meminfo # 大页的实际使用量调优文件读法
| 文件 | 含义 | 调整影响 |
|---|---|---|
| pages_collapsed | 累计合并成的大页数量 | 看增量判断活跃度 |
| pages_to_scan | 每轮扫描的页数上限 | 调大加快合并也增加 CPU 开销 |
| scan_sleep_millisecs | 两轮扫描之间的睡眠时间 | 调大降低干扰、合并变慢 |
| alloc_sleep_millisecs | 分配失败后的睡眠时间 | 内存紧张时避免反复尝试 |
| max_ptes_none | 允许合并的空缺页表比例 | 调大更易合并,也更费内存 |
pages_collapsed 是累计值,单次读取没有意义,必须两次采样求增量;判断抖动是否与合并有关时,应把它和业务延迟曲线放在同一时间轴上对照,而不是只看平均值。
透明大页(THP)与显式大页(hugetlbfs、vm.nr_hugepages)是两套机制:前者由内核自动合并、对应用透明,后者需要应用显式申请并预留内存。两者都出现「大页」字样但配置与观测方式完全不同。