当前位置:首页 > 文章列表 > 文章 > linux > Linux vmstat si/so 长期非零说明什么

Linux vmstat si/so 长期非零说明什么

来源:17golang原创 2026-09-15 17:20:26 0浏览 收藏

Linux 上看到 vmstatsi/so 长期非零,先把它理解成“系统持续在交换空间和内存之间搬运页面”,不要马上等同于内存已经耗尽。si 是从磁盘换入的内存量,so 是换到磁盘的内存量;尤其是 so 在多个采样周期持续增长时,通常说明可回收内存不足,应用工作集正在被挤压。官方字段说明可参考 https://man7.org/linux/man-pages/man8/vmstat.8.html

要点速览
  • vmstat 第一行是自启动以来的平均值,排查持续换页应使用 vmstat -y 1 10 看后续采样行。
  • si 非零不一定危险;si 与 so 同时持续、major fault、wa 或 memory PSI 一起升高,才更像实际内存压力。
  • 先确认主机内存、swap、容器 cgroup 限额和进程工作集,再考虑调整 vm.swappiness,不要用关闭 swap 掩盖根因。
  • 修复后要用相同采样窗口复测,观察 so、pswpout 增量和 PSI 是否同时回落。

先修正时间语义:vmstat 首行不能直接当作当前状态

vmstat 不带延迟参数时输出的是自上次启动以来的平均统计;带上延迟后,第一行仍可能带有启动以来的累计口径,后续行才对应新的采样区间。因此一次看到很大的 si/so,可能只是历史平均或某个短时峰值。

# 跳过启动以来的第一行,只看接下来的 10 个一秒采样区间
vmstat -y 1 10

# 只保留换页、运行队列、阻塞和 I/O 等排查字段
vmstat -y 1 10 | awk 'NR == 1 || NR > 2 { print $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12 }'

关键不是追求某个固定阈值,而是看 so 是否在连续区间都有量、是否伴随 bwa 上升,以及应用延迟是否同步恶化。短时批处理、首次加载大型工作集、休眠页被重新访问,都可能只造成暂时的非零。

Linux vmstat si 和 so 映射到 swap 与 proc vmstat 统计的静态结构说明图
图1:指标映射说明图,展示 vmstat 的 si/so、swap 方向与 /proc/vmstat 累计计数之间的关系;不是截图或运行证据。

si/so 怎样组合才说明内存压力

把两列拆开看更容易误判。si 持续非零,说明之前被换出的页面正在被重新读回,可能是活跃工作集重新访问,也可能只是正常的内存复用;so 持续非零,则表示内核仍在把页面写入 swap。若写出和读回循环出现,应用就可能反复等待慢速存储。

观察组合更合理的判断下一步
si 偶尔非零,so 接近 0可能是历史换出页被重新访问,未必是持续压力看 major fault、延迟和采样窗口
so 连续非零,free 低且 PSI 上升可用内存不足或受限额挤压查进程 RSS、cgroup memory.current 与限额
si、so 交替升高,wa 也高工作集抖动,换入换出正在影响 I/O 等待降低并发或工作集,确认 swap 设备延迟
si/so 非零但业务无感可能是轻量后台回收或 zram 等快速交换仍需看趋势,不用单点值报警

换页量的单位和显示方式受 vmstat 的单位选项影响,所以不要把某个数值跨机器硬套成统一阈值。生产判断应使用同一主机、同一间隔、同一业务时段的趋势。

用 /proc/vmstat、swap 和 PSI 把根因分层

/proc/vmstat 是内核虚拟内存统计的键值文件,pswpinpswpout 是累计计数。连续读取两次并计算差值,可以和 vmstat 的采样区间互相印证;不要把累计值本身当成每秒速率。

# 读取主机的 swap、内存和交换设备,命令只做观察不修改配置
free -h
swapon --show
grep -E '^(Swap|MemAvailable|Active\(|Inactive\()' /proc/meminfo

# 记录两次累计计数,间隔由观察者控制,再用差值判断趋势
grep -E '^(pswpin|pswpout) ' /proc/vmstat

# 检查内存压力停顿;文件不存在时说明当前环境没有暴露 PSI
test -r /proc/pressure/memory && cat /proc/pressure/memory

如果主机 MemAvailable 紧张、pswpout 增长、memory PSI 的 somefull 同时升高,优先按内存压力排查。如果只在容器里出现,则进一步查看 cgroup 的 memory.currentmemory.maxmemory.events;宿主机还有空闲内存,并不能证明容器没有触碰自己的上限。

Linux 内存压力排查中 free、swap、PSI、cgroup 和应用工作集的静态关系图
图2:排障关系说明图,把 si/so 与主机内存、swap、PSI、cgroup 限额和应用工作集放在同一判断边界内;不是截图或运行证据。

修复顺序:先减少压力,再讨论 swappiness

先找出谁在扩大工作集:检查进程 RSS、缓存增长、批处理并发、tmpfs 使用和容器限额;如果是泄漏或无界缓存,应该修复生命周期或设置上限。如果只是流量峰值,让队列限流、降低并发或错峰通常比立即改内核参数更稳。

vm.swappiness 只能改变内核在回收匿名页和文件页之间的倾向,不能增加物理内存,也不能修复单个进程持续增长。调整前记录现状,变更后用同样的 vmstat -y 1 10/proc/vmstat 差值和业务延迟复测。不要因为看到 swap 已使用就直接执行 swapoff -a;在内存紧张时强行换回页面,反而可能触发更严重的回收或 OOM。

常见问题

si/so 长期非零是不是一定要加内存?

不一定。先区分短时峰值、zram、容器限额和真实的工作集增长;只有当换页与 PSI、major fault、业务延迟一起持续恶化时,扩容或降低工作集才是直接方向。

为什么 free 看起来还有空间,so 仍然持续?

可能是进程所在 cgroup 的 memory.max 更小,也可能是可用内存而非 free 更接近真实余量。应同时看 MemAvailable、cgroup 事件和进程所在层级。

只看到 si 上升,应该立刻关闭 swap 吗?

不应该。si 只说明页面被读回,先确认是否伴随 so、major fault、I/O 等待和延迟。如果读回是一次性的工作集恢复,关闭 swap 只会减少系统的缓冲空间。

判断 Linux vmstat si/so 的核心,是把“非零”改成“在明确采样区间内持续、并且是否影响了内存压力与业务”。先跳过首行,再把 swap 方向、内核累计计数、PSI 和 cgroup 放到同一时间窗口,最后才决定是修应用、调资源边界还是调整回收策略。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Go testing.B ReportMetric 如何记录自定义指标Go testing.B ReportMetric 如何记录自定义指标
上一篇
Go testing.B ReportMetric 如何记录自定义指标
Go init 函数和变量初始化的先后如何确认
下一篇
Go init 函数和变量初始化的先后如何确认
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    42次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    136次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    73次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    35次使用
  • CMMLU中文大模型评估基准:功能、使用教程与应用场景解析
    CMMLU
    深入了解CMMLU中文评估基准,涵盖67个学科主题,提供数据集下载、Zero-shot/Five-shot评估方法及排行榜,助力优化中文语言模型性能。
    23次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码