首页/系统/Linux 内核与性能调优速查//proc/zoneinfo 水位与页状态
内存与 OOM58 条

/proc/zoneinfo 水位与页状态

逐 zone 展示 min/low/high 水位、free 页与活跃/非活跃页统计,用于判断水线是否健康、是否长期贴着低水位运行。

文件是什么

/proc/zoneinfo 按 NUMA 节点与内存区域(zone,如 DMA/DMA32/Normal)展示页级统计:min/low/high 三条水位线、空闲页数、活跃与非活跃的匿名页与文件页数量,以及碎片相关字段。它是判断「系统是否长期贴着低水位运行」「是否某个节点或 zone 单独紧张」的基础文件——内核的回收、压缩与 OOM 判断都建立在这些水位之上。

基本信息

读取方式cat /proc/zoneinfo(普通用户一般可读)
组织结构按 Node 分组,每个 Node 下含多个 zone
关键字段pages free、managed、min/low/high、nr_active_anon/file
单位页,通常 4 KiB,可用 getconf PAGESIZE 确认
相关文件/proc/buddyinfo(各阶块)、/proc/meminfo(全局汇总)
容器视角多为宿主数据,不能代表容器自身限额

典型使用场景

  • 判断该调 水位比例 还是 min_free_kbytes:先看当前水位与 free 的关系
  • 排查单节点内存紧张:多 NUMA 机器上只有一个 zone 吃紧也会触发回收压力
  • 解释「free 看着还有不少就开始回收」:水位不足或 zone 内碎片导致
  • 观察 boost 抬升是否发生过,验证碎片化水位机制是否在起作用
  • 核对空闲页换算成字节后与业务预估是否一致,为容量评估提供底数

查看关键行

查看关键行
grep -E 'Node|zone|pages free|managed' /proc/zoneinfo | head -40  # 先看整体结构
awk '/Node/{n=$2} /zone/{z=$2} /pages free/{print n, z, $3}' /proc/zoneinfo  # 逐 zone 汇总空闲页
awk '/^ *min|^ *low|^ *high/{print $1, $2}' /proc/zoneinfo | head  # 三条水位线
cat /proc/buddyinfo  # 各阶空闲块,配合判断碎片
numactl --hardware | head  # 确认节点数与各节点内存规模
getconf PAGESIZE  # 页大小,用于把页数换算成字节

字段读法

字段含义判读要点
pages free当前空闲页数与水位比较判断余量
managed该 zone 管理的总页数反映区域规模
min最低水位跌破即触发同步直接回收
low低水位达到此处唤醒 kswapd
high高水位回到此处 kswapd 停止回收
nr_active_file活跃文件页数量文件缓存压力大的表现
多 NUMA 节点必须分节点看:整机 free 充裕并不代表每个 zone 都健康,单个节点或单个 zone 紧张就足以造成分配延迟、频繁回收甚至 OOM。只看 /proc/meminfo 的汇总数字会把这些局部问题平均掉。
水位值不是固定常量,会随 min_free_kbytes、watermark_scale_factor 以及碎片化时的瞬态抬升而变化。跨时间比较水位时应连同这些参数一起记录,否则无法解释差异来源。

易错点

  • 只看全局 meminfo:节点或 zone 级的局部紧张被平均值掩盖,问题看起来「不存在」
  • 把页数直接当成字节:需要乘以页大小(常见 4 KiB),否则容量估算会差出三个数量级
  • 忽略水位是动态值:调过 min_free_kbytes 或 scale factor 后仍按旧值解读水位
  • 认为 free 高就没有回收压力:水位不足与碎片化都会触发回收,与空闲总量不是同一个问题
  • 在容器里解读 zoneinfo:通常是宿主数据,与容器的 memory.max 限额不是一回事

数据来源与参考

  • Linux 内核 Documentation/filesystems/proc.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌