一、工具总览
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
按顺序回答三个问题:
- 哪块盘慢:看
%util,定位瓶颈磁盘 - 读还是写:看
rMB/s/wMB/s - 为什么慢:
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定位进程,再优化业务或升级硬件
六、易错点与避坑指南
- 首次输出无效 不加采样间隔时输出的是开机平均值,必须加时间间隔,从第二行开始看实时数据。
- iostat 忘加 -x 只能看到读写速度,看不到 IO 等待、磁盘繁忙度,抓不到排障核心。
- %util 不等于性能上限 SSD 并发能力强,util 打满不代表吞吐量到顶,需结合读写量综合判断。
- 跳过全局直接查 IO 系统卡顿先跑 vmstat 定性,避免把 CPU / 内存问题误判成 IO 问题,浪费排查时间。
- WSL 环境限制 WSL2 内核定制化,磁盘 IO 统计不完整,跨系统盘
/mnt/c/数据不准,仅适合学习命令语法。
评论