一、工具总览

1.1 核心定位

工具 全称 核心定位 排查阶段
vmstat Virtual Memory Statistics 系统全局性能概览,一站式查看进程、内存、交换、IO、CPU 整体状态 第一步:定性瓶颈方向
iostat I/O Statistics 磁盘 IO 专项分析,按单盘粒度拆解读写、等待、繁忙度 第二步:深挖 IO 根因

排查原则:先全局后局部,先定性后深挖。先用 vmstat 判断瓶颈大类,再用 iostat 针对性拆解 IO 细节,避免盲目排查。

1.2 通用规则

  • 不带采样间隔直接执行时,第一次输出为开机至今的平均值,不能反映当前实时状态。
  • 正确用法:vmstat 1、iostat -xdm 1,从第二行开始为真实采样值。
  • 两者均属于 sysstat 工具集,系统默认未预装。
# CentOS / 华为云服务器安装
yum install -y sysstat

# Ubuntu / Debian / WSL 安装
apt update && apt install -y sysstat

二、vmstat 详解

2.1 基础语法

vmstat [选项] [采样间隔(秒)] [采样次数]

# 示例:每秒采样1次,共采样5次
vmstat 1 5

2.2 常用参数

参数 作用 适用场景
无选项 + 间隔 默认面板:进程、内存、swap、IO、CPU 90% 场景默认使用,快速扫全局
-a 显示活跃/非活跃内存,替代 buff/cache 判断内存冷热,评估真实内存压力
-s 一次性输出内存、swap、IO、CPU 累计统计摘要 巡检脚本采集、快速核对累计数据
-t 每行末尾追加时间戳 排障留痕,记录问题发生时间点
-d 磁盘统计模式,按单盘输出 IO 累计值 快速查看各盘累计读写量
-S M 内存单位强制为 MB 大内存服务器数值更直观

2.3 输出字段详解

输出分为 6 大类,核心字段如下:

分类 字段 含义 瓶颈判断标准
进程 procs r CPU 就绪队列长度,等待 CPU 的进程数 长期 > CPU 核数 → CPU 饱和
b 不可中断休眠进程数(通常在等 IO) 长期 > 1 → IO 阻塞严重
内存 memory swpd 已使用的交换分区大小 持续上涨 → 物理内存不足
free 空闲内存 持续走低且 cache 被大量回收 → 内存吃紧
交换 swap si 每秒从 swap 换入内存的量 持续不为 0 → 内存严重不足
so 每秒从内存换出到 swap 的量 频繁交换会严重拖慢系统
IO bi 每秒从块设备读入的块数 全局 IO 总量参考,无法区分单盘
bo 每秒写入块设备的块数
CPU us 用户态 CPU 占比 > 70% → 业务程序消耗 CPU
sy 系统内核态 CPU 占比 > 30% → 系统调用频繁、上下文切换多
id CPU 空闲占比 接近 0 → CPU 整体饱和
wa CPU 等待 IO 占比 > 30% → 存在明显 IO 瓶颈

2.4 高频组合命令

# 1. 实时全局监控(最常用)
vmstat 1

# 2. 带时间戳采样 10 次,排障留痕
vmstat -t 1 10

# 3. 快速查看内存整体统计
vmstat -s

# 4. 活跃内存视角
vmstat -a 1

三、iostat 详解

3.1 基础语法

iostat [选项] [采样间隔(秒)] [采样次数]

核心提醒:不加 -x 只能看到基础读写量,看不到等待时间、繁忙度等排障核心指标,等于白跑。

3.2 常用参数

参数 作用 适用场景
-x 开启扩展详细模式,输出 await、%util 等核心指标 IO 排障必加,灵魂参数
-d 只显示磁盘统计,隐藏 CPU 部分 专注排查 IO 问题
-c 只显示 CPU 统计,隐藏磁盘部分 单独看 CPU 分项
-m 读写速度以 MB/s 为单位 默认 KB 可读性差,几乎必搭配
-p 设备名 只查看指定磁盘/分区,如 -p sda 已定位目标盘,专注单盘分析
-t 每行追加时间戳 排障留痕
-z 无 IO 活动的磁盘不显示 多盘服务器过滤空闲盘

3.3 扩展模式核心字段(-x)

字段 含义 判断标准
rMB/s / wMB/s 每秒读/写吞吐量,单位 MB 区分读密集还是写密集
await IO 请求平均耗时,含排队 + 实际处理,单位 ms 机械盘 > 50ms、SSD > 10ms 属于偏慢
svctm 磁盘纯处理耗时,不含排队时间 await 远大于 svctm → 请求堆积排队
avgqu-sz IO 请求平均队列长度 持续变大 → 请求积压严重
%util 磁盘繁忙时间占比 机械盘接近 100% ≈ 性能饱和;SSD 需结合吞吐量判断

经典误区:%util 是时间占比,不是吞吐量占比。SSD 并发能力强,100% 繁忙时仍可承接更多 IO,不能单凭此指标判定性能到顶。

3.4 高频组合命令

# 1. 【最高频】所有磁盘详细 IO,MB 单位,实时刷新
iostat -xdm 1

# 2. 只看指定磁盘 sda
iostat -xdm sda 1

# 3. 多盘服务器:带时间戳,自动过滤空闲盘
iostat -xdmzt 1

# 4. 只看 CPU 分项
iostat -c 1

四、标准性能排查流程

服务器卡顿、负载高时,按以下四步固定排查:

第 1 步:确认整体负载

uptime

查看 1/5/15 分钟负载,对比日常基线,判断是突发异常还是持续走高。

第 2 步:全局定性瓶颈类型

vmstat 1

观察 10 秒,按以下规则分类:

  • CPU 瓶颈:r 队列高、us+sy 占比高、id 接近 0、wa 低
  • 内存瓶颈:swpd 持续上涨、si/so 频繁有值、free 持续下降
  • IO 瓶颈:b 队列高、wa > 30%、CPU 整体空闲但都在等 IO

第 3 步:IO 瓶颈深挖磁盘

确认 IO 问题后执行:

iostat -xdm 1

按顺序回答三个问题:

  1. 哪块盘慢:看 %util,定位瓶颈磁盘
  2. 读还是写:看 rMB/s / wMB/s
  3. 为什么慢:await 远大于 svctm → 请求排队;两者都高 → 硬件性能到顶

第 4 步:定位肇事进程

盘级定位后,找到具体进程:

# 实时查看进程 IO 排名(最直观)
iotop

# 按秒采样,输出每个进程 IO 统计(适合脚本采集)
pidstat -d 1

找到高 IO 进程后,结合业务日志、程序逻辑做针对性优化。


五、三大典型故障场景

场景 1:CPU 高负载

  • vmstat 表现:r 队列很高,us 占比 80%+,id 接近 0,wa 很低
  • 常见原因:业务逻辑复杂、死循环、加密计算、编译任务
  • 后续排查:top / htop 找高 CPU 进程,pidstat -u 1 细化到线程

场景 2:内存不足导致系统卡顿

  • vmstat 表现:swpd 持续上涨,si/so 频繁不为 0,free 持续下降
  • 常见原因:内存泄漏、Java 堆内存过大、缓存服务配置超量
  • 后续排查:free -h 看内存分布,top 按内存排序找耗内存进程

场景 3:磁盘 IO 打满导致响应慢

  • vmstat 表现:b 队列很高,wa 占比 40%+
  • iostat 表现:某块盘 %util 接近 100%,await 飙升到几百毫秒
  • 常见原因:慢 SQL、日志狂写、备份任务、磁盘硬件故障
  • 后续排查:iotop 定位进程,再优化业务或升级硬件

六、易错点与避坑指南

  1. 首次输出无效 不加采样间隔时输出的是开机平均值,必须加时间间隔,从第二行开始看实时数据。
  2. iostat 忘加 -x 只能看到读写速度,看不到 IO 等待、磁盘繁忙度,抓不到排障核心。
  3. %util 不等于性能上限 SSD 并发能力强,util 打满不代表吞吐量到顶,需结合读写量综合判断。
  4. 跳过全局直接查 IO 系统卡顿先跑 vmstat 定性,避免把 CPU / 内存问题误判成 IO 问题,浪费排查时间。
  5. WSL 环境限制 WSL2 内核定制化,磁盘 IO 统计不完整,跨系统盘 /mnt/c/ 数据不准,仅适合学习命令语法。

🔗 相关笔记