首页/系统/Linux 内核与性能调优速查/vm.extfrag_threshold 碎片判定阈值
内存与 OOM58 条

vm.extfrag_threshold 碎片判定阈值

高阶分配失败时用于判断该优先碎片整理还是直接回收的阈值(默认 500);判定依赖内核的碎片指数,一般无需调整。

参数是什么

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_indexdebugfs 的 extfrag 目录各阶碎片指数,与阈值直接比较
unusable_indexdebugfs 的 extfrag 目录因碎片而不可用的内存比例
buddyinfo/proc/buddyinfo各阶空闲块分布,最直观的碎片证据
compact_*/proc/vmstat整理的触发、成功与失败次数
allocstall/proc/vmstat直接回收造成的分配停顿计数
该阈值的判定语义在历史上经过调整,不同内核版本对碎片指数与阈值的比较细节并不完全一致。照搬旧教程给出的数值解释容易得出错误结论,跨版本对比前应先确认当前内核的文档与行为。
debugfs 默认不一定挂载,读不到 extfrag_index 时应先执行挂载再判断,而不是直接认定内核不支持或碎片不存在。容器内通常也看不到这些文件,需在宿主机侧观察。

易错点

  • debugfs 未挂载就去读碎片指数:报文件不存在,容易误判成内核不支持该功能
  • 盲目调低阈值以为能减少回收:可能让整理做得更频繁,CPU 开销上升而收益不明显
  • 只看参数不看现场:不与 buddyinfo、extfrag_index、compact 计数一起看,无法判断真实碎片状态
  • 把高阶分配失败一律归因于碎片:内存总量不足、cgroup 限额或 NUMA 节点紧张同样会造成失败
  • 把改动写进生产基线:这是内核内部策略旋钮,缺少实测数据支撑的调整风险大于收益

数据来源与参考

  • Linux 内核 Documentation/admin-guide/sysctl/vm.rst
  • Linux 内核 Documentation/admin-guide/mm/compaction.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌