4.3.2 实时监控与统计(pidstat、vmstat、iostat、sar)

实时监控与统计用于快速定位瓶颈与趋势,重点关注 CPU、内存、I/O 与上下文切换等指标的短期波动与中期趋势。常用工具包括 pidstat、vmstat、iostat、sar。

文章图片

安装与前置
多数发行版的工具来自 sysstat 包(含 pidstat/iostat/sar),vmstat 属于 procps。

# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y sysstat procps

# CentOS/RHEL
sudo yum install -y sysstat procps-ng

# 启用 sar 采集(systemd)
sudo systemctl enable --now sysstat
# 验证 sar 数据目录
ls /var/log/sa/

1. pidstat(按进程/线程维度)
适合定位单个进程的 CPU、I/O、上下文切换异常。
- 常用命令与解释
- pidstat -u 1:每秒采样进程 CPU 使用率
- pidstat -r 1:进程内存使用
- pidstat -d 1:进程 I/O 读写
- pidstat -w 1:上下文切换
- pidstat -p <PID> -t 1:指定进程且按线程展示
- 关键字段
- %usr/%system/%iowait:CPU 分布
- RSS/VSZ:实际与虚拟内存
- kB_rd/s kB_wr/s:I/O 速率
- cswch/s nvcswch/s:自愿/非自愿切换

示例:定位 nginx 工作进程 CPU 飙升

# 1) 找到主进程 PID
pidof nginx

# 2) 观察线程级 CPU
pidstat -p $(pidof nginx) -t 1

# 3) 只看 I/O
pidstat -p $(pidof nginx) -d 1

预期效果:输出按线程/进程的 %usr/%system,快速定位异常线程。

排错要点:
- 输出为空:确认 PID 存在、权限足够(建议 sudo)。
- %iowait 偏高:进一步用 iostat 验证磁盘。


2. vmstat(系统级概览)
快速看 CPU、内存、进程队列与 I/O。
- 常用命令与解释
- vmstat 1:每秒采样系统概况
- vmstat -s:内存统计累计值
- 关键字段
- r:运行队列长度(过大可能 CPU 紧张)
- si/so:swap in/out(非零需警惕)
- us sy id wa:CPU 时间分布

示例:观察系统负载与换页

# 每秒采样 10 次
vmstat 1 10

预期效果:r 持续大于 CPU 核数、wa 高表示等待 I/O;si/so 非零可能内存不足。

排错要点:
- r 高但 id 也高:可能进程被阻塞在 I/O/锁。
- si/so 持续非零:检查内存与缓存策略、OOM 日志。


3. iostat(磁盘 I/O 统计)
定位磁盘吞吐、延迟与利用率。
- 常用命令与解释
- iostat -x 1:扩展指标
- iostat -d 1:按磁盘统计
- 关键字段
- r/s w/s:读写次数
- rkB/s wkB/s:吞吐
- await:平均 I/O 延迟
- %util:磁盘忙碌度(接近 100% 为瓶颈)

示例:定位磁盘延迟

# 扩展指标,每秒一次
iostat -x 1

# 只看指定磁盘
iostat -x 1 /dev/sda

预期效果:await 持续升高、%util 接近 100% 表示磁盘成为瓶颈。

排错要点:
- await 高但 %util 不高:可能是队列深度或存储后端问题。
- 多块盘负载不均:检查 RAID/绑定路径策略。


4. sar(历史统计与趋势)
系统级历史数据与多维统计,适合趋势分析与基线比对。
- 常用命令与解释
- sar -u 1:CPU
- sar -r 1:内存
- sar -b 1:I/O
- sar -n DEV 1:网络
- sar -q 1:负载
- 关键字段
- load average:系统负载趋势
- pgpgin/s pgpgout/s:分页
- rxpck/s txpck/s:网络包速率

示例:回溯昨日高峰

# 查看昨日的 CPU 统计
sar -u -f /var/log/sa/sa$(date -d yesterday +%d)

# 查看昨日 14:00-15:00 的负载区间
sar -q -f /var/log/sa/sa$(date -d yesterday +%d) -s 14:00:00 -e 15:00:00

预期效果:输出历史区间统计,用于与当前对比。

排错要点:
- sar 无数据:检查 sysstat 服务是否启用、/var/log/sa 是否生成文件。
- 采样频率不足:调整 /etc/sysstat/sysstatHISTORYINTERVAL


综合示例:从系统到进程的定位流程

# 1) 先看系统层面
vmstat 1 5
iostat -x 1 5

# 2) 再定位进程
pidstat -u 1 5
pidstat -d 1 5

# 3) 回溯历史趋势
sar -u 1 3

练习
1) 制造 CPU 负载并用 pidstat 定位

# 终端A:制造负载
yes > /dev/null

# 终端B:观察
pidstat -u 1
# 结束负载
pkill yes

2) 模拟 I/O 压力并用 iostat 分析

# 写入大文件(请确保有空间)
dd if=/dev/zero of=/tmp/io_test.img bs=1M count=2048 oflag=direct

# 观察磁盘
iostat -x 1
rm -f /tmp/io_test.img

3) 用 sar 建立基线并对比

# 记录当前 CPU 统计
sar -u 1 3
# 记录当前负载
sar -q 1 3

实践要点
- 先用 vmstat/iostat 观察系统层面,再用 pidstat 定位进程。
- 观察指标应结合业务时间窗口,避免单点误判。
- 对比历史基线(sar)可区分“突发”与“长期退化”。