/proc/zoneinfo 提供了系统中每个内存区域(Zone)的详细统计信息,包括内存使用情况、水位线阈值、页面回收策略等。以下是其输出参数的逐项解析。
1. 基本结构
每个内存区域(如DMA、DMA32、Normal)的信息按以下格式展示:
Node 0, zone DMA
pages free 1355 # 空闲页面数
min 35 # 最低水位线
low 44 # 低水位线
high 53 # 高水位线
scanned 0 # 最近扫描的页面数(用于回收)
spanned 4096 # 总覆盖的页面范围(包含内存空洞)
present 4096 # 实际存在的物理页面数
managed 3964 # 由伙伴系统管理的页面数
protection: (0, 0, 0) # 保护组(用于NUMA)
...
2. 关键参数解析
(1) 页面统计
参数 说明
pages free 当前Zone的空闲页面数(可直接分配)。
spanned Zone覆盖的总页面数,包含内存空洞(如未连接的物理地址)。
present 实际存在的物理页面数(spanned - 内存空洞)。
managed 由伙伴系统管理的页面数(present - 保留页,如内核启动时保留的内存)。
示例:
若 spanned=4096(16MB)、present=2048(8MB),说明该Zone有50%的内存空洞。
(2) 水位线(Watermarks)
参数 说明
min 最低水位线:空闲页面低于此值时,触发直接内存回收(同步回收)。
low 低水位线:空闲页面低于此值时,启动后台回收(kswapd)。
high 高水位线:回收内存直到空闲页面达到此值,停止回收。
规则:
当 free < low 时,触发后台回收。
当 free < min 时,触发同步回收(可能导致进程阻塞)。
(3) 页面回收统计
参数 说明
scanned 最近一次回收中扫描的页面总数。
nr_active_anon 活跃的匿名页(如进程堆内存)数量。
nr_inactive_anon 非活跃的匿名页数量(可能被回收)。
nr_active_file 活跃的文件缓存页数量。
nr_inactive_file 非活跃的文件缓存页数量(优先被回收)。
nr_unevictable 不可回收的页面(如mlock锁定的内存)。
(4) 保护组(Protection Groups)
仅NUMA系统中生效,用于平衡跨节点内存分配。
protection: (0, 0, 0) # 格式:(Node0, Node1, Node2)
含义:当前Zone为其他节点保留的最小空闲页面数。例如,(100, 200, 0) 表示为Node0保留100页,Node1保留200页。
(5) 其他重要参数
参数 说明
nr_free_cma CMA(连续内存分配器)区域的空闲页面数。
nr_zone_write_pending 等待写回磁盘的脏页数量。
nr_dirty 当前Zone的脏页总数。
nr_writeback 正在写回磁盘的页面数。
3. 示例解析
以以下输出片段为例:
Node 0, zone Normal
pages free 28012
min 9843
low 12293
high 14743
spanned 26214400
present 26214400
managed 25423567
nr_active_anon 123456
nr_inactive_anon 78901
nr_active_file 234567
nr_inactive_file 345678
nr_unevictable 512
...
空闲内存:28,012页(约109MB),高于high水位线(14,743页),说明当前无内存压力。
内存总量:present=26,214,400页(约100GB),全部由伙伴系统管理(managed≈25.4GB)。
匿名页:活跃123,456页,非活跃78,901页,可能用于进程堆内存。
文件缓存:活跃234,567页,非活跃345,678页,文件缓存充足。
不可回收页:512页,可能是mlock锁定的内存。
4. 诊断与优化
(1) 内存压力判断
正常状态:free ≥ high。
潜在压力:free < low,需观察nr_inactive_file是否充足(可回收缓存)。
紧急状态:free < min,触发直接回收,可能导致进程延迟。
(2) 优化建议
增加缓存回收:若nr_inactive_file较高,可通过echo 3 > /proc/sys/vm/drop_caches释放缓存。
调整水位线:修改/proc/sys/vm/min_free_kbytes调整min值(谨慎操作)。
监控脏页:若nr_dirty过高,需优化磁盘I/O或调整dirty_ratio。
总结
通过 /proc/zoneinfo 可以:
量化内存分布:了解每个Zone的空闲、保留和管理页面。
诊断内存压力:根据水位线和回收统计判断是否需要优化。
优化回收策略:根据活跃/非活跃页面比例调整内核参数(如swappiness)。
此工具是分析内核内存管理和性能调优的核心手段。