首页/系统/Linux 内核与性能调优速查//proc/vmstat 内存计数速查
内存与 OOM58 条

/proc/vmstat 内存计数速查

pgpgin/pgpgout、pswpin/pswpout、pgmajfault、pgscan_direct、allocstall、oom_kill 等累计计数是做趋势与告警的原始数据。

文件是什么

/proc/vmstat 汇集内核虚拟内存子系统的累计计数器:pgpgin/pgpgout 反映页的进出 IO,pswpin/pswpout 反映换入换出,pgmajfault 反映主缺页,pgscan_kswapd/pgscan_direct 与 allocstall 反映回收与分配停顿,oom_kill 反映实际终止次数。所有数值都从开机起单调累加,价值在于差分后的速率与长期趋势,它也是监控系统内存类指标的原始数据源。

基本信息

文件路径/proc/vmstat
数据性质全部为累计计数,必须两次采样求差
IO 计数pgpgin、pgpgout
换页计数pswpin、pswpout
回收计数pgscan_kswapd、pgscan_direct、pgsteal_*
分配停顿allocstall 系列(按 zone 分类)
缺页与 OOMpgfault、pgmajfault、oom_kill

典型使用场景

  • 判断系统是否频繁直接回收:pgscan_direct 与 allocstall 的增量是关键证据
  • 确认换页是否活跃:pswpout 持续增长说明内存压力已传导到磁盘
  • 量化主缺页速率,解释应用启动或内存紧张时的延迟
  • 为监控告警提供原始计数,差分得到每秒速率后再设阈值
  • 与 cgroup 指标对照,区分压力来自全局还是某个容器

提取与对照

提取与对照
grep -E '^(pgpgin|pgpgout|pswpin|pswpout)' /proc/vmstat  # 页 IO 与换页累计
grep -E '^(pgscan_direct|pgscan_kswapd|pgsteal_normal)' /proc/vmstat  # 回收扫描与回收量
grep -E '^(allocstall|oom_kill)' /proc/vmstat  # 分配停顿与 OOM 终止
grep -E '^(pgfault|pgmajfault)' /proc/vmstat  # 缺页计数
sar -B 1 5  # 直接给出换页与回收的每秒速率,省去手工差分
vmstat 1 5  # 关注 si/so 两列是否持续非零

关键计数读法

计数含义判读要点
pgpgin / pgpgout页的读入与写出次数反映整体页 IO 量,不区分设备
pswpin / pswpout换入换出的页数持续增长说明内存压力已转成磁盘 IO
pgmajfault主缺页次数(需要磁盘 IO)速率高代表访问路径有磁盘等待
pgscan_direct直接回收扫描的页数增量大说明回收被压到分配路径上
allocstall分配时被迫直接回收的次数延迟敏感系统最该盯的信号
oom_killOOM 终止次数非零即需复盘
这些计数从开机起只增不减,任何判断都要基于两次采样之间的增量,并按时间间隔换算成速率。直接拿绝对值与阈值比较是常见误用。
不同内核版本的计数项会有增删(例如 allocstall 系列的分类方式)。采集脚本应容忍字段缺失,不要因为某个计数不存在而整段解析失败。

易错点

  • 拿累计值直接设阈值告警:应采集增量速率,否则阈值随开机时长单调逼近
  • 把 pgpgout 增长当成磁盘瓶颈:它是所有页写出的合计,需要结合设备级 IO 指标才能定位
  • 忽略 allocstall 与 pgscan_direct:它们是分配路径停顿的直接证据,对尾延迟影响显著
  • 在容器里读全局 vmstat 判断自身内存压力:这是宿主视图,容器应看 cgroup 的文件
  • 按固定字段名写死解析:内核版本升级后字段可能消失,脚本会静默给出零值

数据来源与参考

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