参数是什么
vm.extfrag_threshold 是内核面对高阶内存分配失败时的决策阈值,默认 500。内核计算各阶的碎片指数(extfrag_index),当碎片指数高于该阈值时,说明内存虽零散但仍有希望拼出连续块,于是优先做内存整理(compaction);低于阈值则更可能判断为「整理也没用」,转而直接回收。它属于内核内部策略旋钮,多数场景保持默认即可。
基本信息
| 参数名 | vm.extfrag_threshold |
|---|---|
| 默认值 | 500 |
| 比较对象 | 各 zone/各阶的碎片指数(extfrag_index) |
| 观测路径 | /sys/kernel/debug/extfrag/(需挂载 debugfs) |
| 配套文件 | /proc/buddyinfo、/proc/vmstat 中的 compact_* 计数 |
| 调整建议 | 无明确碎片证据时保持默认,改动需用 buddyinfo 与失败率验证 |
典型使用场景
- 排查高阶分配失败:结合 buddyinfo 与碎片指数判断是碎片问题还是总量不足
- 解释「内核为什么在做回收而不是整理」:阈值决定了两者的优先级
- 分析整理开销:compact_* 计数频繁增长时,评估阈值与负载的匹配度
- 大页或驱动 DMA 分配异常时,作为碎片侧证据链的一环
- 确认 debugfs 未挂载导致读不到碎片指数,避免把环境问题误判为内核缺陷
查看碎片现状
查看碎片现状
sysctl vm.extfrag_threshold # 当前阈值
cat /proc/buddyinfo # 各阶空闲块数量,直接看高阶块是否稀缺
mount | grep -q debugfs || sudo mount -t debugfs none /sys/kernel/debug # 需要先挂载
sudo cat /sys/kernel/debug/extfrag/extfrag_index # 各 zone、各阶碎片指数,与阈值比较
grep -E 'compact_|allocstall' /proc/vmstat # 整理触发/失败与直接回收计数
sysctl -w vm.extfrag_threshold=800 # 临时调整,仅用于对照实验,重启回退相关指标
| 指标 | 位置 | 含义 |
|---|---|---|
| extfrag_index | debugfs 的 extfrag 目录 | 各阶碎片指数,与阈值直接比较 |
| unusable_index | debugfs 的 extfrag 目录 | 因碎片而不可用的内存比例 |
| buddyinfo | /proc/buddyinfo | 各阶空闲块分布,最直观的碎片证据 |
| compact_* | /proc/vmstat | 整理的触发、成功与失败次数 |
| allocstall | /proc/vmstat | 直接回收造成的分配停顿计数 |
该阈值的判定语义在历史上经过调整,不同内核版本对碎片指数与阈值的比较细节并不完全一致。照搬旧教程给出的数值解释容易得出错误结论,跨版本对比前应先确认当前内核的文档与行为。
debugfs 默认不一定挂载,读不到 extfrag_index 时应先执行挂载再判断,而不是直接认定内核不支持或碎片不存在。容器内通常也看不到这些文件,需在宿主机侧观察。