
linux-tutorial 之 vmstat 命令全解从虚拟内存状态到系统性能全景监控【免费下载链接】linux-tutorial:penguin: Linux教程主要内容Linux 命令、Linux 系统运维、软件运维、精选常用Shell脚本项目地址: https://gitcode.com/GitHub_Trending/lin/linux-tutorial导读vmstat是 Linux 系统性能排查中最常用的命令之一它虽名为显示虚拟内存状态却能一次性输出进程、内存、交换分区、磁盘 I/O、系统中断/上下文切换与 CPU 占用六大维度的实时数据。本篇文章以 linux-tutorial 仓库中的 vmstat.md 文档为主体完整讲解vmstat的语法、选项、参数、输出字段含义与判读方法并结合仓库中的 Shell 实战脚本创建捕捉脚本.sh展示如何把vmstat写入自动化性能采集流程。读完本文你将能够熟练使用vmstat定位 CPU 瓶颈、内存不足、磁盘 I/O 等待等常见系统问题。vmstat 命令概述vmstat命令的含义是显示虚拟内存状态Virtual Memor Statics但它的能力远超虚拟内存本身——它可以报告关于进程、内存、I/O 等系统整体运行状态。与top、ps这类面向进程级细节的命令不同vmstat只对系统整体情况进行分析无法深入某个具体进程。这一特点与同仓库 iostat.md 中对iostat的描述如出一辙同 vmstat 一样iostat 也有一个弱点就是它不能对某个进程进行深入分析仅对系统的整体情况进行分析。因此vmstat是快速感知系统是否健康的粗筛工具发现问题后通常还需配合top、ps等命令做进程级定位。仓库中 命令行的艺术.md 也专门提醒若要了解内存状态运行并理解free和vmstat的输出特别要留意 cached 的值——它指 Linux 内核用来作为文件缓存的内存大小与空闲内存无关。语法与选项vmstat(选项)(参数)常用选项如下表所示选项作用-a显示活动内页active/inactive 内存页-f显示启动后创建的进程总数-m显示 slab 信息内核对象缓存-n头信息仅显示一次周期性刷新时不重复打印表头-s以表格方式显示事件计数器和内存状态-d报告磁盘状态-p显示指定的硬盘分区状态-S输出信息的单位如-S M以 MB 为单位参数说明参数说明事件间隔状态信息刷新的时间间隔单位秒次数显示报告的次数注意参数是可选的。不带任何参数直接执行vmstat会输出一条自系统启动以来的平均统计信息指定间隔后命令会周期性刷新输出直到到达次数上限不指定次数则持续输出需按CtrlC终止。实战vmstat 3 输出详解执行vmstat 3每隔 3 秒输出一次系统状态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第一行是字段表头第二行是自启动以来的平均值从第三行开始才是每个间隔周期的实时快照。下面按字段分组逐项解读。Procs进程字段含义判读要点r运行队列中进程数量即等待 CPU 的进程数这个值可以用来判断是否需要增加 CPU若长期大于 1 说明 CPU 可能不足b等待 IO 的进程数量数值越大说明越多进程阻塞在磁盘等 I/O 上Memory内存字段含义判读要点swpd已使用的虚拟内存大小被换出到交换分区的内存如果 swpd 的值不为 0但si、so的值长期为 0这种情况不会影响系统性能free空闲物理内存大小不能单独据此判断内存不足需结合si/so综合判断buff用作缓冲buffer的内存大小用于缓存磁盘块数据cache用作缓存cache的内存大小如果 cache 的值大说明 cache 处的文件数多如果频繁访问到的文件都能被 cache 命中那么磁盘的读 IObi会非常小Swap交换字段含义判读要点si每秒从交换区写到内存的大小swap in由磁盘调入内存内存够用时为 0so每秒写入交换区的内存大小swap out由内存调入磁盘内存够用时为 0注意内存够用的时候这 2 个值都是 0如果这 2 个值长期大于 0 时系统性能会受到影响磁盘 IO 和 CPU 资源都会被消耗。有些朋友看到空闲内存free很少或接近于 0 时就认为内存不够用了。不能光看这一点还要结合si和so判断如果 free 很少但是 si 和 so 也很少大多数时候是 0那么不用担心系统性能这时不会受到影响——因为那些看似被占用的内存其实是可以被回收的 cache/buffer。IO磁盘读写字段含义判读要点bi每秒读取的块数block in现在的 Linux 版本块的大小为 1KBbo每秒写入的块数block out同上注意随机磁盘读写的时候这 2 个值越大如超出 1024K能看到 CPU 在 IO 等待wa的值也会越大。System系统字段含义判读要点in每秒中断数包括时钟中断值越大由内核消耗的 CPU 时间越大cs每秒上下文切换数值越大内核消耗的 CPU 时间越大CPU以百分比表示字段含义判读要点us用户进程执行时间百分比user timeus 的值比较高时说明用户进程消耗的 CPU 时间多如果长期超过 50%就该考虑优化程序算法或者进行加速sy内核系统进程执行时间百分比system timesy 的值高时说明系统内核消耗的 CPU 资源多这并不是良性表现应该检查原因waIO 等待时间百分比wa 的值高时说明 IO 等待比较严重这可能由于磁盘大量作随机访问造成也有可能磁盘出现瓶颈块操作id空闲时间百分比空闲 CPU 占比st被虚拟机偷走的时间百分比运行在虚拟化环境时才可能非 0输出表头中共有 17 列完整顺序为r b swpd free buff cache si so bi bo in cs us sy id wa st理解这一列序对脚本解析输出至关重要见下文实战。从 vmstat 输出定位系统瓶颈快速判读指南综合原文档的判读要点可以总结出一套简洁的定位思路先看 CPUus长期超 50% 说明应用层吃 CPU需优化程序或扩容sy偏高说明内核开销大中断、上下文切换过多wa偏高说明磁盘 I/O 是瓶颈而不是 CPU 不够。再看 Swapsi/so长期非 0 是内存不足的硬信号会连带拖垮磁盘 IO 与 CPU若仅free小但si/so为 0则只是 cache/buffer 占用了名义空闲的内存不必紧张。看进程队列r长期大于 1 说明 CPU 排队严重b偏大说明进程阻塞在 I/O 上。看 IObi/bo过大且伴随wa上升说明磁盘读写是当前主要矛盾可结合iostat进一步确认具体设备。在 Shell 脚本中调用 vmstat仓库源码级实战vmstat的输出是固定列结构非常适合在 Shell 脚本中通过管道与sed/gawk组合解析用于自动化性能采集。仓库中的 创建捕捉脚本.shCapture_Stats就是一个典型范例它把 vmstat 的采样结果写入 CSV 报告文件#!/usr/bin/env bash # # Capture_Stats - Gather System Performance Statistics # REPORT_FILE/home/tiandi/Documents/capstats.csv DATEdate %m/%d/%y TIMEdate %k:%M:%S # USERSuptime | sed s/user.*$// | gawk {print $NF} LOADuptime | gawk {print $NF} # FREEvmstat 1 2 | sed -n /[0-9]/p | sed -n 2p | gawk {print $4} IDLEvmstat 1 2 | sed -n /[0-9]/p | sed -n 2p | gawk {print $15} # echo $DATE,$TIME,$USERS,$LOAD,$FREE,$IDLE $REPORT_FILE这段脚本的解析逻辑值得拆解vmstat 1 2间隔 1 秒采样、共输出 2 次。第一次输出是系统启动以来的累计平均值第二次才是这 1 秒内的实时快照因此取第 2 行数据最有代表性。sed -n /[0-9]/p过滤掉表头等不含数字的行只保留数据行。sed -n 2p取第 2 条数据行即 1 秒间隔内的实时数据。gawk {print $4}取第 4 列即free空闲物理内存gawk {print $15}取第 15 列即idCPU 空闲百分比。结合上文输出列序r b swpd free buff cache si so bi bo in cs us sy id wa st可以验证第 4 列恰好是free第 15 列恰好是id。这种列序号直接对应字段的确定性正是 vmstat 适合嵌入自动化脚本的根本原因。该脚本最终把日期、时间、在线用户数、系统负载、空闲内存、CPU 空闲率以 CSV 形式追加到报告文件配合 crontab参考 crontab.md即可搭建轻量级性能监控。与相关命令的配合使用vmstat擅长宏观判断但定位到具体问题后还需与其他命令协同磁盘 IO 深化vmstat的bi/bo/wa异常时用 iostat如iostat -x /dev/sda1查看具体设备的%util、await等指标确认瓶颈在哪个磁盘。内存状态交叉验证用 free 查看-/ buffers/cache行理解对应用程序来说可用内存 free buffers cached避免被空闲内存很小误导也可直接读取/proc/meminfo核对MemAvailable。进程级定位vmstat发现 CPU 或内存压力后用top或ps aux排序找出具体进程仓库中的 syscheck.sh 就集成了top -b n1提取 CPU/内存占用 TOP10 的完整逻辑。仓库的 命令行的艺术.md 同样将vmstat与free并列列为理解内存状态的必读命令可见它们是性能排查中的标准套餐。总结vmstat用一行输出浓缩了系统运行的六大核心指标是 Linux 运维与性能排查的入门必修课。掌握其选项-a/-m/-s/-d/-p等、间隔/次数参数、17 列字段含义与判读要点之后你就能快速区分 CPU 瓶颈、内存瓶颈与磁盘 I/O 瓶颈还能像仓库中的 创建捕捉脚本.sh 一样把它嵌入自动化监控脚本持续采集系统状态。若需进一步深入学习可继续阅读仓库 Linux 命令行索引 下的 free.md、iostat.md、top.md 等配套文档构建完整的系统性能监控知识体系。【免费下载链接】linux-tutorial:penguin: Linux教程主要内容Linux 命令、Linux 系统运维、软件运维、精选常用Shell脚本项目地址: https://gitcode.com/GitHub_Trending/lin/linux-tutorial创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考