vmstat命令:检测系统资源变化
Linux 系统的内存分为物理内存和虚拟内存两种。物理内存是真实的,也就是物理内存条上的内存。而虚拟内存则是采用磁盘空间来补充物理内存,将暂时不适用的内存页写到磁盘上以腾出更多的物理内存让有需要的进程使用。当这些已被腾出的内存页需要再次使用时才从磁盘(虚拟内存)中读回内存。这一切对与用户来说是透明的。通常对Linux 系统来说,虚拟内存就是swap分区。
vmstat(Virtual Memory Statistics,虚拟内存统计)是Linux 中监控内存的常用工具,可对操作系统的虚拟内存、进程和CPU等整体情况进行监视。
vmstat的命令格式如下:
vmstat [-a] [n] [ delay [ count ] ] vmstat [-f] [-s] [-m] vmstat [-S unit] vmstat [-d] vmstat [-p disk partition] vmstat [-V]
基本格式与参数说明:
vmstat [n] [delay [count]]
此格式为默认使用方式。其中:
n:指定采样间隔次数(即显示多少组数据)。例如vmstat 5将每隔一定时间(由delay决定)输出5组统计结果后退出。
delay:采样间隔时间(秒),默认为1秒。例如vmstat 2 3表示每2秒采集一次数据,共采集3次。
count(可选):总采样次数。若不指定,vmstat将持续运行,直到手动终止。
例如:vmstat 2 5 将每2秒输出一次统计信息,共输出5次后停止。这对观察系统负载的动态变化非常有用,尤其在排查间歇性问题时。

高级选项与功能扩展:
-a:显示活跃(active)和非活跃(inactive)内存页面统计。该选项可帮助用户判断系统内存是否被高效利用。例如,当活跃内存持续升高而空闲内存不足时,可能提示内存压力或内存泄漏问题。 -f:显示系统启动以来的fork次数。通过该指标可评估系统进程创建的频率,高fork次数可能意味着存在进程频繁创建/销毁的情况(如Web服务器或数据库应用)。 -s:以表格形式显示内存统计数据,包括总内存、空闲、缓存、交换分区等详细信息。此选项适合快速获取系统内存概览,尤其适用于脚本或自动化监控场景。 -m:显示内存 slab 信息(内核内存分配机制)。该选项对内核开发者或高级系统调优人员有价值,可帮助诊断内核内存分配问题。 -S unit:指定输出的单位(如K/M/G,默认为K)。例如vmstat -S M将以MB为单位显示内存和交换区大小,便于更直观地理解大容量系统的资源占用。 -d:显示磁盘统计信息,包括读/写请求次数、块数、平均等待时间等。该选项对分析磁盘I/O瓶颈至关重要,例如识别高延迟的磁盘设备或分区。 -p 磁盘分区:仅显示指定磁盘分区的I/O统计(如vmstat -p /dev/sda1)。此功能可针对特定存储设备进行精细化监控,帮助定位具体分区的性能问题。 -V:显示vmstat命令的版本信息,便于确认工具版本及兼容性。
监控系统整体负载与内存使用情况: 执行vmstat 2(默认每2秒更新一次),可实时观察以下关键指标: procs(r、b):r表示等待运行的进程数,b表示阻塞进程数。若r持续高于CPU核心数,或b值显著增加,可能表明CPU或I/O资源不足。 memory(swpd、free、buff/cache):swpd升高可能意味着系统过度使用交换分区(性能下降),而free过低则需关注内存压力。
分析磁盘I/O性能: 使用vmstat -d查看磁盘读写速率(如read total、write total)和等待时间(await)。若await远高于svc_time(服务时间),则可能存在磁盘响应延迟问题,需检查硬件或RAID配置。
排查内存泄漏问题: 结合-a和-s选项,例如vmstat -a -s 5,每隔5秒输出活跃/非活跃内存及总内存统计。若活跃内存持续增长且非活跃内存无显著变化,可能表明有进程未释放内存资源。
优化Web服务器性能:
通过vmstat -f获取系统fork次数,若数值在短时间内急剧增加,可能提示Web应用(如PHP-FPM)存在频繁启动子进程的情况,需调整进程池配置或优化代码。
与其他性能工具的协同使用:
vmstat常与top、iostat、sar等工具结合使用,形成全面的性能分析体系。例如:先用vmstat发现CPU或内存异常,再用top定位具体高负载进程;结合iostat -p细化磁盘I/O到分区层面;通过sar记录历史性能数据,辅助趋势分析。
| 字段 | 类别 | 说明 |
| r | process(进程) | 表示运行队列中进程的数量 |
| b | process(进程) | 表示阻塞队列中进程的数量 |
| swpd | memory(内存) | 表示交换分区的使用情况 |
| free | memory(内存) | 表示空闲内存的大小 |
| buff | memory(内存) | 表示缓冲内存的大小 |
| cache | memory(内存) | 表示页缓存的大小 |
| si | swap(交换页面) | 表示每秒从磁盘读入虚拟内存的大小 |
| so | swap(交换页面) | 表示每秒写入磁盘的虚拟内存的大小 |
| bi | I/O(块设备) | 表示每秒读取的块设备数量 |
| bo | I/O(块设备) | 表示每秒写入的块设备数量 |
| in | system(系统) | 表示每秒的中断次数,包括时钟中断 |
| cs | CPU(处理器) | 示每秒的上下文切换次数 |
| us | CPU(处理器) | 表示用户进程消耗的CPU时间百分比 |
| sy | CPU(处理器) | 表示系统进程消耗的CPU时间百分比 |
| id | CPU(处理器) | 表示CPU处于空闲状态的时间百分比 |
| wa | CPU(处理器) | 表示CPU等待I/O操作完成的时间百分比 |
| st | CPU(处理器) | 表示被偷取的CPU时间百分比(通常用于虚拟化环境) |
vmstat命令是Linux和类Unix系统中重要的性能监控工具,用于实时展示系统的CPU、内存、磁盘I/O、进程状态等关键指标。其输出结果通常分为多列,每一列代表不同的系统资源使用情况。
r(Running):运行队列中的进程数,即等待CPU调度的进程数量。若r值持续高于系统的CPU核心数(例如,r > 核心数 * 2),说明CPU资源严重不足,可能导致系统响应变慢。例如,当r长期保持在10以上,而服务器只有4核CPU时,应考虑增加CPU资源或优化进程优先级。 b(Blocked/Uninterruptible Sleep):处于不可中断睡眠状态的进程数。这些进程通常等待硬件I/O操作(如磁盘读写、网络传输)完成。若b值突然升高,可能表明I/O设备故障或资源瓶颈。例如,大量b进程可能暗示磁盘故障或文件系统问题。
swpd(Swap Used):被交换到磁盘的虚拟内存大小(单位:KB)。高swpd值意味着内存不足,系统频繁将内存数据换出到磁盘,会导致性能急剧下降。例如,当swpd持续增长且free接近0时,应考虑增加物理内存或减少内存消耗型进程。 free(Free Memory):空闲的物理内存。若free长期接近0,系统会频繁触发内存回收机制(如LRU算法),影响性能。需结合buff/cache判断实际可用内存。 buff(Buffer Memory):用于缓冲块设备(如磁盘)读写操作的内存。例如,当进行大量文件读写时,buff会临时缓存数据,减少磁盘访问延迟。 cache(CACHED Memory):缓存文件系统数据(如已读文件、目录结构)的内存。cache可显著提高文件访问速度,系统会自动回收空闲的cache,因此不必担心其占用过多内存。例如,频繁访问同一文件时,cache能减少I/O开销。
si(Swap In):每秒从磁盘交换到内存的页数。高si值通常与swpd增加相关,表明系统正在从磁盘恢复内存数据,性能堪忧。
so(Swap Out):每秒从内存交换到磁盘的页数。持续高so可能由内存不足或内核参数配置不当引起。
bi(Block In):每秒从块设备(磁盘、SSD等)读入的块数。高bi可能表示大量随机读操作,需检查是否有磁盘密集型进程(如数据库查询)。
bo(Block Out):每秒写入块设备的块数。高bo常见于日志写入、文件同步等场景。若bi/bo过高且磁盘利用率饱和,可能需升级存储设备或优化I/O模式。
in(Interrupts):每秒中断次数,包括时钟中断、硬件中断(如键盘输入、网络包到达)。高in值可能由网络流量激增或硬件故障引起。 cs(Context Switches):每秒上下文切换次数。上下文切换是进程调度时的资源切换过程,若cs过高(例如每秒数万次),可能由频繁的小任务调度导致,影响CPU效率。例如,高并发的短时进程(如微服务)可能引发高cs。
us(User Time):用户进程消耗的CPU时间百分比。高us(接近100%)表明用户态程序繁忙,如计算密集型任务。 sy(System Time):内核进程(系统调用、驱动等)消耗的CPU时间。高sy可能由内核级操作频繁(如内存管理、设备驱动交互)导致。 id(Idle Time):CPU空闲时间百分比。id低而us/sy高是正常现象,但id接近0且r值高则说明CPU过载。 wa(Wait I/O):CPU等待I/O完成的时间百分比。高wa(例如超过30%)通常由磁盘或网络I/O延迟引起。例如,机械硬盘的随机读写会导致高wa,而SSD或NVMe设备则通常wa较低。 st(Steal Time):虚拟化环境中的CPU时间被其他虚拟机或宿主系统“偷走”的百分比。仅适用于虚拟机场景,高st可能需调整资源分配。
综合诊断示例:若观察到r高、us高、wa低,可能由CPU计算瓶颈导致(如多线程程序竞争CPU);而r高、us低、wa高则指向I/O阻塞(如慢速存储设备)。结合bi/bo与wa可进一步定位问题。 内存与swap调优:当free较低但buff/cache较高时,系统实际可用内存为free + cache(因为cache可被动态释放)。若swpd持续增长,可调整内核参数(如vm.swappiness)减少swap使用,或增加内存。 I/O性能优化:若bi/bo异常高,可使用iostat命令进一步分析磁盘利用率(%util)、响应时间(await)等指标,判断是否需要更换SSD或优化磁盘调度算法。 上下文切换监控:高cs可能由多线程程序、频繁的系统调用或内核参数不当引起。可通过修改进程调度策略(如使用实时调度器)或优化代码减少切换次数。
单次vmstat输出可能无法反映趋势,建议使用vmstat 1 5(每秒更新一次,共5次)观察动态变化。 wa高不一定总是问题:例如,批处理任务在等待数据加载时wa升高是正常现象,需结合业务场景判断。 内存指标需综合考量:free低但系统运行正常时,可能是buff/cache有效利用了内存。盲目增加内存可能浪费资源。 虚拟化环境中的st:若st持续高于10%,可能需检查宿主机资源分配或虚拟机配置是否合理。
zrg

浙公网安备 33010602011771号