- 文档
- 教程
【免费下载链接】linux-command
Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。https://git.io/linux
vmstat(Virtual Memory Statistics)是 Linux 系统自带的性能快照工具,名字看似只针对"虚拟内存状态",实际输出却同时覆盖进程、内存、交换分区、磁盘 IO、中断与 CPU 六大维度,是系统管理员做性能初检时的首选命令之一。本文以 linux-command 仓库中的 command/vmstat.md 为骨架,逐列拆解其输出字段含义、常用选项与组合用法,并结合仓库中 free、iostat、mpstat、dstat 等命令文档做交叉印证,帮助读者在系统卡顿、内存告警、IO 瓶颈等场景下快速定位问题根因。
vmstat 是什么
vmstat 命令的含义为"显示虚拟内存状态"(Virtual Memory Statistics),但正如 command/vmstat.md 所述,它可以报告关于进程、内存、I/O 等系统整体运行状态。它适合回答三类典型问题:
- CPU 是否饱和:运行队列长度(r 列)、用户态/内核态占用比例;
- 内存是否够用:空闲内存、缓冲/缓存、交换区的换入换出速率;
- 磁盘 IO 是否成为瓶颈:每秒读写块数(bi/bo)与 CPU 等待 IO 的时间(wa)。
在 linux-command 仓库的索引文件 dist/data.json 中,vmstat 被登记为"d": "显示虚拟内存状态",即仓库 600 多个 Linux 命令速查文档的一员,可直接在 Web 版速查页面检索阅读。
语法与选项
vmstat(选项)(参数)选项说明
-a:显示活动内页; -f:显示启动后创建的进程总数; -m:显示slab信息; -n:头信息仅显示一次; -s:以表格方式显示事件计数器和内存状态; -d:报告磁盘状态; -p:显示指定的硬盘分区状态; -S:输出信息的单位。各选项的适用场景补充说明:
-a:把默认的内存字段拆分为active(活动)与inactive(非活动)两类内页,便于观察内存页的真实活跃度;-f:输出的是本次开机以来 fork 出的进程总数,可用于观察系统整体进程创建频率;-m:输出内核 slab 分配器(slab allocator)信息,内核对象、inode、dentry 等缓存都从这里分配,排查内核态内存占用时很有用;-n:配合定时刷新使用时,只在第一屏打印表头,避免刷屏时反复输出标题行,适合持续观察场景;-s:以表格形式输出事件计数器与内存状态,例如总内存、空闲内存、换入换出页数、中断次数等累计值,适合一次性快照;-d:按磁盘设备(如 sda、vda)输出读写统计,颗粒度比默认整体 IO 更细;-p:进一步细化到某个分区(如vmstat -p /dev/sda1);-S:指定输出信息的单位,常见用法如-S k(KB)、-S m(MB),默认一般以 KB 为单位,内存较大或需要人工读数时建议显式指定单位避免歧义。
参数说明
- 事件间隔:状态信息刷新的时间间隔(秒)。例如
vmstat 3表示每 3 秒输出一行; - 次数:显示报告的次数。例如
vmstat 3 5表示每 3 秒输出一次,共输出 5 行后退出;只写间隔不写次数时,命令会持续运行直到手动中断(Ctrl+C)。
不带任何参数直接运行vmstat,输出的是系统自启动以来的平均值,适合一眼概览;带间隔参数后才是一段时间内的实时采样。这一点与仓库中 mpstat 文档的提醒一致:不带参数输出的是启动以来的平均值,看不出瞬时变化,要正确反映系统情况需要正确使用命令的参数,vmstat 也需要注意这一问题。
实例:逐列解读默认输出
vmstat 3 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 320 42188 167332 1534368 0 0 4 7 1 0 0 0 99 0 0 0 0 320 42188 167332 1534392 0 0 0 0 1002 39 0 0 100 0 0 0 0 320 42188 167336 1534392 0 0 0 19 1002 44 0 0 100 0 0 0 0 320 42188 167336 1534392 0 0 0 0 1002 41 0 0 100 0 0 0 0 320 42188 167336 1534392 0 0 0 0 1002 41 0 0 100 0 0这个示例来自 command/vmstat.md,每 3 秒采样一行。示例中系统处于基本空闲状态:CPU 空闲率(id)接近 100%,内存与交换区均无持续压力。下面按列分组逐项解读。
Procs(进程)
| 字段 | 含义 | 判断要点 |
|---|---|---|
| r | 运行队列中进程数量,即等待 CPU 调度的进程数 | 这个值也可以判断是否需要增加 CPU:长期大于 1 说明 CPU 已出现排队 |
| b | 等待 IO 的进程数量 | 数值持续偏高说明有进程阻塞在磁盘等 IO 上 |
需要说明的是,r 值判断"长期大于 1 即需增加 CPU"是仓库文档给出的经验阈值,实际还应结合机器核数、wa 等列综合判断——多核机器上短时间 r 大于核数是正常的,关键是观察其是否长期维持高位。
Memory(内存)
| 字段 | 含义 | 判断要点 |
|---|---|---|
| swpd | 使用虚拟内存(交换分区)大小 | 如果 swpd 的值不为 0,但是 si、so 的值长期为 0,这种情况不会影响系统性能 |
| free | 空闲物理内存大小 | 空闲内存少不一定代表内存不够,见下文"si/so 才是关键" |
| buff | 用作缓冲的内存大小 | 针对磁盘块的读写缓存 |
| cache | 用作缓存的内存大小 | cache 值大说明缓存的文件数量多;如果频繁访问的文件都能被 cache 命中,磁盘的读 IO(bi)会非常小 |
关于 buff 与 cache 的区别,仓库中的 free 文档有更详细的阐述:page cache 用来缓存文件数据,buffer cache 用来缓存磁盘数据。在有文件系统的情况下,对文件操作时数据会缓存到 page cache;如果直接采用 dd 等工具对磁盘进行读写,数据会缓存到 buffer cache。理解这一点,就能明白为什么"cache 大、bi 小"往往是文件读多且命中率高的良性表现。
Swap(交换区)
| 字段 | 含义 |
|---|---|
| si | 每秒从交换区写到内存的大小,即由磁盘调入内存(swap in) |
| so | 每秒写入交换区的内存大小,即由内存调入磁盘(swap out) |
这是判断内存是否真正紧张的关键两列。内存够用的时候,这两个值都是 0;如果这两个值长期大于 0,说明系统在内存与磁盘之间反复搬运页面,磁盘 IO 和 CPU 资源都会被消耗,系统性能会受到影响。
仓库文档特别强调了一个常见误区:不能只看空闲内存(free)少就断定内存不够用。当 free 很少甚至接近 0 时,还要结合 si 和 so 一起看——如果 free 很少但 si、so 也很少(大多数时候是 0),那么不用担心,因为 free 少往往只是内存被 page cache 占用的正常表现,系统性能不会因此受到影响。这一判断逻辑与 free 文档完全一致:对应用程序来说,buffers/cached 是可以被快速回收挪用的内存,可用内存 = 系统 free memory + buffers + cached。
IO(磁盘读写)
注意:现在的 Linux 版本块的大小为 1kb。
| 字段 | 含义 |
|---|---|
| bi | 每秒读取的块数 |
| bo | 每秒写入的块数 |
判断要点:随机磁盘读写的时候,这两个值越大(如超出 1024k),能看到 CPU 在 IO 等待(wa)的值也会越大。也就是说 bi/bo 与 wa 往往联动升高,共同指向磁盘 IO 负载过重。
system(系统)
| 字段 | 含义 |
|---|---|
| in | 每秒中断数,包括时钟中断 |
| cs | 每秒上下文切换数 |
判断要点:上面两个值越大,会看到由内核消耗的 CPU 时间(sy)会越大。上下文切换过高常见于进程/线程数过多的场景(例如线程池配置过大、锁竞争激烈),此时中断与切换开销本身就在蚕食 CPU。
CPU(以百分比表示)
| 字段 | 含义 | 判断要点 |
|---|---|---|
| us | 用户进程执行时间百分比(user time) | us 值比较高说明用户进程消耗的 CPU 时间多;如果长期超过 50%,就该考虑优化程序算法或者进行加速 |
| sy | 内核系统进程执行时间百分比(system time) | sy 值高说明系统内核消耗的 CPU 资源多,这并不是良性表现,应该检查原因 |
| wa | IO 等待时间百分比 | wa 值高说明 IO 等待比较严重,这可能由于磁盘大量随机访问造成,也有可能磁盘出现瓶颈(块操作) |
| id | 空闲时间百分比 | 与 wa 互补:id 高且 wa 低才是健康的空闲 |
输出示例中还包含ni(nice 优先级调整后的用户态时间)与st(steal 时间)两列,原文档未展开,可结合仓库中其他命令文档理解:mpstat 文档中%nice指在用户级别处理经 nice 降级的程序所使用 CPU 的百分比;%steal指在管理程序为另一个虚拟处理器服务时,虚拟的一个或多个 CPU 在非自愿等待中花费的时间百分比(见 command/mpstat.md)。在云主机或虚拟机环境中,若 st 长期不为 0,说明宿主机 CPU 资源存在竞争。
实战:与仓库其他性能命令交叉验证
vmstat 是整体快照,定位到具体瓶颈后,通常需要与其他命令配合做更细粒度的排查,linux-command 仓库为这些命令都收录了独立文档:
- 磁盘 IO 细化:当 vmstat 的 wa、bi、bo 异常时,用 iostat 查看具体设备:
iostat -x 1可输出 r/s、w/s、r_await、w_await、%util 等扩展指标。其中iowait 指在一个采样周期内有百分之几的时间 CPU 处于空闲状态并且至少有一个未完成的磁盘 IO 请求,与 vmstat 的 wa 含义同源;若 %util 接近 100%,说明该磁盘可能已成为瓶颈。 - CPU 逐核细化:vmstat 给出的是整机 CPU 汇总,用 mpstat 的
mpstat -P ALL 2 3可以观察每个物理 CPU 的 usr/sys/iowait/irq/soft 明细,定位是单核热点还是整体过载。 - 持续监控与落盘:dstat 文档明确指出,dstat 是一个用来替换 vmstat、iostat、netstat、nfsstat 和 ifstat 的工具,支持彩色界面、即时刷新与 CSV 输出(
dstat --output /root/dstat.csv),适合需要把监控数据导出成图表的长时观测。 - 内存与进程补充:free 给出内存总量与 buffers/cached 的可回收视角,top 则能按进程排序找出具体"吃" CPU 或内存的进程,形成"vmstat 发现问题 → top/ps 定位进程 → iostat/mpstat 验证根因"的标准排查链路。
典型问题排查速查
| 现象 | 关注字段 | 可能原因与动作 |
|---|---|---|
| 系统响应慢,r 长期 > 1 | procs/r | CPU 排队严重,考虑扩容或优化并发模型 |
| free 接近 0 但 si/so 为 0 | free、si、so | 内存被 page cache 合理占用,无需紧张 |
| si/so 长期 > 0 | si、so | 真实的内存交换压力,考虑加物理内存或优化内存占用 |
| wa 持续升高且 bi/bo 很大 | wa、bi、bo | 磁盘 IO 瓶颈,检查随机读写负载、考虑换更快的磁盘或调整应用 |
| us 长期 > 50% | us | 用户程序计算密集,考虑优化算法或加速 |
| sy 异常偏高 | sy、in、cs | 内核开销大,检查中断/上下文切换来源、驱动或系统调用频率 |
| 虚拟机中 st 不为 0 | st | 宿主机 CPU 资源竞争,考虑迁移或调整虚拟核数 |
小结
vmstat 的核心价值在于"一屏看全貌":进程队列、内存缓存、交换压力、磁盘 IO、中断切换、CPU 分布六大维度一次输出,配合间隔与次数参数即可完成短期采样。需要记住两条最重要的判断原则:内存是否够用看 si/so 而非 free,磁盘是否瓶颈看 bi/bo 与 wa 的联动。结合本仓库的 iostat、mpstat、free、top 等命令文档,即可从 vmstat 的"整体快照"逐步下钻到"具体设备/进程"级别的精确诊断。
- 文档
- 教程
【免费下载链接】linux-command
Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。https://git.io/linux
相关推荐
linux-command 命令手册:nstat 详解——用内核 SNMP 计数器监控网络接口状态
linux command 命令手册:nstat 详解——用内核 SNMP 计数器监控网络接口状态 nstat 是一个简单而实用的网络诊断工具,专门用于监视 L
文档教程Linux 内核模块信息查询实战:linux-command 仓库 modinfo 命令详解
Linux 内核模块信息查询实战:linux command 仓库 modinfo 命令详解 本文以 linux command 仓库中 modinfo 命令文
文档教程linux-command 仓库详解:bash export 命令完整指南
linux command 仓库详解:bash export 命令完整指南 export 是 bash 内建命令,用于为 shell 变量或函数设置"导出属性"
文档教程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考