系统监控工具指南 / 第8章:vmstat/iostat/SAR
第8章:vmstat/iostat/SAR
8.1 概述
工具定位
| 工具 | 全称 | 主要用途 |
|---|---|---|
| vmstat | Virtual Memory Statistics | 虚拟内存统计 |
| iostat | IO Statistics | IO统计 |
| mpstat | Multiprocessor Statistics | 多处理器统计 |
| SAR | System Activity Reporter | 系统活动报告 |
为什么学习这些工具
- 系统自带 - 无需额外安装
- 轻量高效 - 资源消耗极低
- 脚本友好 - 适合自动化监控
- 历史数据 - SAR支持长期记录
工具对比
| 特性 | vmstat | iostat | mpstat | SAR |
|---|---|---|---|---|
| CPU监控 | ✓ | ✗ | ✓ | ✓ |
| 内存监控 | ✓ | ✗ | ✗ | ✓ |
| 磁盘监控 | ✓ | ✓ | ✗ | ✓ |
| 网络监控 | ✗ | ✗ | ✗ | ✓ |
| 历史数据 | ✗ | ✗ | ✗ | ✓ |
| 实时监控 | ✓ | ✓ | ✓ | ✓ |
安装sysstat
# Debian/Ubuntu
sudo apt update
sudo apt install sysstat
# CentOS/RHEL
sudo yum install sysstat
# 启用SAR数据收集
sudo systemctl enable sysstat
sudo systemctl start sysstat
8.2 vmstat详解
8.2.1 基本用法
# 显示一次统计
vmstat
# 每秒刷新,共5次
vmstat 1 5
# 持续监控(Ctrl+C停止)
vmstat 1
# 显示活跃和非活跃内存
vmstat -a 1
# 以MB为单位
vmstat -S M 1
# 显示磁盘统计
vmstat -d 1
# 显示slab信息
vmstat -m 1
8.2.2 输出解读
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 819200 51200 409600 0 0 10 20 100 200 5 2 92 1 0
2 0 0 800000 51200 409600 0 0 0 30 150 300 8 3 88 1 0
Procs(进程):
| 字段 | 含义 | 正常值 |
|---|---|---|
| r | 运行队列中的进程数 | <CPU核心数 |
| b | 不可中断睡眠的进程数 | 0或接近0 |
Memory(内存):
| 字段 | 含义 | 说明 |
|---|---|---|
| swpd | 已使用的交换空间 | 应该为0或很小 |
| free | 空闲内存 | |
| buff | 缓冲区大小 | |
| cache | 缓存大小 | |
| inact | 不活跃内存 | -a选项显示 |
| active | 活跃内存 | -a选项显示 |
Swap(交换):
| 字段 | 含义 | 正常值 |
|---|---|---|
| si | 从磁盘换入的内存 | 0 |
| so | 换出到磁盘的内存 | 0 |
IO:
| 字段 | 含义 | 单位 |
|---|---|---|
| bi | 块设备接收的块数 | blocks/s |
| bo | 块设备发送的块数 | blocks/s |
System(系统):
| 字段 | 含义 | 说明 |
|---|---|---|
| in | 每秒中断数 | 包括时钟中断 |
| cs | 每秒上下文切换数 | 进程切换 |
CPU:
| 字段 | 含义 | 正常范围 |
|---|---|---|
| us | 用户空间占用 | <70% |
| sy | 内核空间占用 | <30% |
| id | 空闲 | >30% |
| wa | IO等待 | <20% |
| st | 虚拟机偷取时间 | <5% |
8.2.3 性能判断
CPU瓶颈:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
8 0 0 100000 51200 409600 0 0 0 0 500 1000 85 10 5 0 0
- r值高(>CPU核心数)
- us值高
- id值低
IO瓶颈:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 5 0 800000 51200 409600 0 0 500 1000 800 600 10 5 30 55 0
- b值高
- wa值高
- bi/bo值高
内存不足:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 1 500000 1000 51200 409600 100 200 100 200 300 400 20 10 60 10 0
- swpd值高
- si/so值不为0
8.2.4 高级用法
磁盘统计:
vmstat -d
# 输出
# disk- ------------reads------------ ------------writes----------- -----IO------
# total merged sectors ms total merged sectors ms cur sec
# sda 12345 123 1234567 12345 56789 456 5678901 23456 0 123
Slab信息:
vmstat -m
# 输出
# Cache Num Total Size Pages
# ext4_inode_cache 1234 2000 640 25
# dentry 5678 8000 192 42
内存统计:
vmstat -s
# 输出
# 16384000 K total memory
# 12000000 K used memory
# 4384000 K active memory
# 2000000 K inactive memory
# 4384000 K free memory
8.2.5 脚本化应用
#!/bin/bash
# vmstat_monitor.sh
LOG_FILE="/var/log/vmstat_$(date +%Y%m%d).log"
while true; do
vmstat 1 1 | tail -1 >> $LOG_FILE
sleep 5
done
8.3 iostat详解
8.3.1 基本用法
# 显示CPU和IO统计
iostat
# 扩展信息
iostat -x
# 每秒刷新,共5次
iostat -x 1 5
# 持续监控
iostat -x 1
# 只显示磁盘
iostat -d 1
# 只显示CPU
iostat -c 1
# 以MB为单位
iostat -m 1
# 显示指定设备
iostat -x sda sdb 1
8.3.2 输出解读
CPU统计:
avg-cpu: %user %nice %system %iowait %steal %idle
5.23 0.00 2.15 1.08 0.00 91.54
磁盘统计(基础):
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 123.45 567.89 234.56 1234567 567890
磁盘统计(扩展):
Device rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 1.23 4.56 12.34 56.78 123.45 567.89 23.45 0.12 5.67 3.45 6.78 1.23 45.67
8.3.3 字段详解
| 字段 | 含义 | 说明 |
|---|---|---|
| rrqm/s | 每秒合并的读请求数 | 越高表示顺序IO多 |
| wrqm/s | 每秒合并的写请求数 | 越高表示顺序IO多 |
| r/s | 每秒读请求数 | 随机IO指标 |
| w/s | 每秒写请求数 | 随机IO指标 |
| rkB/s | 每秒读取的KB数 | 读吞吐量 |
| wkB/s | 每秒写入的KB数 | 写吞吐量 |
| avgrq-sz | 平均请求大小(扇区) | IO大小指标 |
| avgqu-sz | 平均请求队列长度 | 越高表示IO越繁忙 |
| await | 平均IO等待时间(毫秒) | 包含排队时间 |
| r_await | 读平均等待时间 | |
| w_await | 写平均等待时间 | |
| svctm | 平均服务时间(毫秒) | 不准确,已弃用 |
| %util | 设备忙碌百分比 | >70%可能有瓶颈 |
8.3.4 性能判断
IO性能判断:
| 指标 | 正常范围 | 异常表现 | 可能原因 |
|---|---|---|---|
| %util | <70% | >80% | IO瓶颈 |
| await | <10ms | >20ms | IO延迟高 |
| avgqu-sz | <1 | >2 | 请求排队 |
| r/s + w/s | 取决于磁盘 | SSD: >10000 | 超出磁盘能力 |
不同磁盘的IO能力:
| 磁盘类型 | IOPS(随机读写) | 吞吐量(顺序读写) |
|---|---|---|
| SATA HDD | 100-200 | 100-200 MB/s |
| SAS HDD | 200-300 | 200-300 MB/s |
| SATA SSD | 10000-50000 | 500-550 MB/s |
| NVMe SSD | 100000-500000 | 3000-7000 MB/s |
8.3.5 高级用法
指定设备:
# 监控指定磁盘
iostat -x sda 1
# 监控多个磁盘
iostat -x sda sdb 1
# 监控分区
iostat -x sda1 sda2 1
输出格式:
# JSON格式(需要sysstat 12+)
iostat -o JSON -x 1
# 带时间戳
iostat -t -x 1
8.3.6 脚本化应用
#!/bin/bash
# iostat_monitor.sh
LOG_FILE="/var/log/iostat_$(date +%Y%m%d).log"
while true; do
iostat -x 1 1 | grep -E "^(Device|sda)" >> $LOG_FILE
sleep 5
done
8.4 mpstat详解
8.4.1 基本用法
# 显示所有CPU统计
mpstat
# 每秒刷新,共5次
mpstat 1 5
# 显示所有CPU核心
mpstat -P ALL 1
# 显示指定CPU
mpstat -P 0,1,2,3 1
# 显示中断统计
mpstat -I ALL 1
8.4.2 输出解读
CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
all 5.23 0.00 2.15 1.08 0.12 0.23 0.00 0.00 0.00 91.19
0 6.34 0.00 2.56 0.89 0.15 0.28 0.00 0.00 0.00 89.78
1 4.12 0.00 1.74 1.27 0.09 0.18 0.00 0.00 0.00 92.60
字段详解:
| 字段 | 含义 |
|---|---|
| %usr | 用户空间占用 |
| %nice | nice值调整的进程 |
| %sys | 内核空间占用 |
| %iowait | IO等待 |
| %irq | 硬件中断 |
| %soft | 软件中断 |
| %steal | 虚拟机偷取时间 |
| %guest | 运行虚拟CPU |
| %gnice | 运行nice虚拟CPU |
| %idle | 空闲 |
8.4.3 中断统计
mpstat -I ALL 1
# 输出
CPU intr/s
all 234.56
0 123.45
1 111.11
CPU 0/s 1/s 6/s 8/s 12/s 14/s ...
all 0.00 0.12 0.00 12.34 0.00 0.00 ...
8.4.4 性能分析
CPU负载不均:
mpstat -P ALL 1
# 如果某个CPU负载特别高,可能是:
# 1. 进程CPU亲和性设置
# 2. 中断分布不均
# 3. 锁竞争
中断分析:
# 查看中断分布
mpstat -I CPU 1
# 查看具体中断
cat /proc/interrupts
8.5 SAR详解
8.5.1 基本用法
# 实时CPU统计
sar -u 1 5
# 实时内存统计
sar -r 1 5
# 实时磁盘统计
sar -d 1 5
# 实时网络统计
sar -n DEV 1 5
# 查看历史数据
sar -u
# 查看昨天数据
sar -u -f /var/log/sysstat/sa$(date -d yesterday +%d)
8.5.2 CPU统计
# CPU使用率
sar -u
# 输出
14:00:01 CPU %user %nice %system %iowait %steal %idle
14:10:01 all 5.23 0.00 2.15 1.08 0.00 91.54
14:20:01 all 6.34 0.00 2.56 0.89 0.00 90.21
Average: all 5.79 0.00 2.36 0.99 0.00 90.88
参数选项:
sar -u 1 5 # 每秒刷新,共5次
sar -u -f sa10 # 查看10号的历史数据
sar -u -b 14:00 # 从14:00开始
sar -u -e 16:00 # 到16:00结束
8.5.3 内存统计
# 内存使用
sar -r
# 输出
14:00:01 kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
14:10:01 8192000 12000000 8192000 50.00 512000 4096000 12000000 75.00 6000000 4000000 12345
字段详解:
| 字段 | 含义 |
|---|---|
| kbmemfree | 空闲内存(KB) |
| kbavail | 可用内存(KB) |
| kbmemused | 已使用内存(KB) |
| %memused | 内存使用率 |
| kbbuffers | 缓冲区大小 |
| kbcached | 缓存大小 |
| kbcommit | 已承诺内存 |
| %commit | 承诺百分比 |
| kbactive | 活跃内存 |
| kbinact | 不活跃内存 |
| kbdirty | 脏页大小 |
8.5.4 磁盘统计
# 磁盘IO
sar -d
# 输出
14:00:01 DEV tps rkB/s wkB/s areq-sz aqu-sz await svctm %util
14:10:01 sda 123.45 567.89 234.56 23.45 0.12 5.67 1.23 45.67
字段详解:
| 字段 | 含义 |
|---|---|
| tps | 每秒传输数 |
| rkB/s | 每秒读取KB |
| wkB/s | 每秒写入KB |
| areq-sz | 平均请求大小 |
| aqu-sz | 平均队列长度 |
| await | 平均等待时间 |
| svctm | 平均服务时间 |
| %util | 设备忙碌百分比 |
8.5.5 网络统计
# 网络接口统计
sar -n DEV
# 输出
14:00:01 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
14:10:01 eth0 1234.56 2345.67 567.89 234.56 0.00 0.00 12.34 0.00
网络统计类型:
sar -n DEV # 网络接口统计
sar -n EDEV # 网络错误统计
sar -n TCP # TCP连接统计
sar -n SOCK # Socket统计
字段详解(DEV):
| 字段 | 含义 |
|---|---|
| rxpck/s | 每秒接收包数 |
| txpck/s | 每秒发送包数 |
| rxkB/s | 每秒接收KB |
| txkB/s | 每秒发送KB |
| rxcmp/s | 每秒接收压缩包 |
| txcmp/s | 每秒发送压缩包 |
| rxmcst/s | 每秒接收多播包 |
| %ifutil | 接口利用率 |
8.5.6 负载统计
# 系统负载
sar -q
# 输出
14:00:01 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked
14:10:01 2 215 0.52 0.58 0.59 0
8.5.7 上下文切换
# 上下文切换统计
sar -w
# 输出
14:00:01 proc/s cswch/s
14:10:01 1.23 1234.56
8.5.8 历史数据管理
# 查看可用的历史数据
ls -la /var/log/sysstat/
# 文件命名格式
# saDD - 二进制数据文件
# sarDD - 文本报告文件
# 查看指定日期
sar -u -f /var/log/sysstat/sa10
# 查看指定时间段
sar -u -f /var/log/sysstat/sa10 -b 14:00 -e 16:00
# 导出为文本
sar -u -f /var/log/sysstat/sa10 > /tmp/cpu_report.txt
8.5.9 数据收集配置
# 编辑sysstat配置
sudo nano /etc/sysstat/sysstat
# 主要配置项
HISTORY=28 # 保留天数
COMPRESSAFTER=10 # 压缩天数
SADC_OPTIONS="-S ALL" # 收集选项
# 编辑cron
sudo nano /etc/cron.d/sysstat
# 默认每10分钟收集一次
*/10 * * * * root /usr/lib/sysstat/sa1 1 1
# 每小时生成报告
53 23 * * * root /usr/lib/sysstat/sa2 -A
8.6 综合应用
8.6.1 性能分析流程
# 第一步:检查CPU
sar -u 1 5
# 如果%idle低,检查哪些进程消耗CPU
top -o %CPU
# 第二步:检查内存
sar -r 1 5
# 如果%memused高,检查内存大户
top -o %MEM
# 第三步:检查磁盘IO
sar -d 1 5
# 如果%util高,检查IO大户
iotop -o
# 第四步:检查网络
sar -n DEV 1 5
# 如果流量高,检查网络连接
iftop -i eth0
8.6.2 自动化监控脚本
#!/bin/bash
# sar_monitor.sh
LOG_DIR="/var/log/custom_sar"
mkdir -p $LOG_DIR
while true; do
TIMESTAMP=$(date '+%Y%m%d_%H%M%S')
# CPU
sar -u 1 1 | tail -1 >> $LOG_DIR/cpu_$TIMESTAMP.log
# 内存
sar -r 1 1 | tail -1 >> $LOG_DIR/mem_$TIMESTAMP.log
# 磁盘
sar -d 1 1 | tail -1 >> $LOG_DIR/disk_$TIMESTAMP.log
# 网络
sar -n DEV 1 1 | tail -1 >> $LOG_DIR/net_$TIMESTAMP.log
sleep 60
done
8.6.3 瓶颈定位组合
#!/bin/bash
# bottleneck_check.sh
echo "=== CPU检查 ==="
sar -u 1 3 | tail -1
echo "=== 内存检查 ==="
sar -r 1 3 | tail -1
echo "=== 磁盘检查 ==="
sar -d 1 3 | tail -1
echo "=== 网络检查 ==="
sar -n DEV 1 3 | tail -1
echo "=== 负载检查 ==="
sar -q 1 3 | tail -1
8.7 实战场景
场景1:CPU瓶颈分析
问题:系统响应缓慢,怀疑CPU瓶颈
# 1. 检查CPU使用率
sar -u 1 5
# 输出分析
# %user高 → 用户进程消耗CPU
# %system高 → 系统调用多
# %iowait高 → 等待IO
# 2. 如果%user高,找出CPU消耗大户
top -o %CPU
# 3. 如果%iowait高,检查IO
sar -d 1 5
场景2:内存问题排查
问题:系统频繁使用swap
# 1. 检查内存使用
sar -r 1 5
# 2. 检查swap活动
sar -W 1 5
# 输出
# pswpin/s - 每秒换入页面数
# pswpout/s - 每秒换出页面数
# 3. 如果swap频繁,找出内存大户
top -o %MEM
# 4. 检查具体进程内存
pmap -x <PID>
场景3:磁盘IO瓶颈
问题:磁盘IO很高
# 1. 检查磁盘使用率
sar -d 1 5
# 如果%util > 80%,有IO瓶颈
# 2. 检查IO等待时间
iostat -x 1 5
# 如果await > 20ms,IO延迟高
# 3. 找出IO大户
iotop -o
# 4. 检查具体进程
pidstat -d 1 5
场景4:网络流量分析
问题:网络流量异常
# 1. 检查网络接口流量
sar -n DEV 1 5
# 2. 检查网络错误
sar -n EDEV 1 5
# 3. 检查TCP连接
sar -n TCP 1 5
# 4. 如果流量高,找出来源
iftop -i eth0
场景5:历史数据分析
问题:昨天下午系统异常
# 1. 查看昨天的CPU数据
sar -u -f /var/log/sysstat/sa$(date -d yesterday +%d)
# 2. 查看特定时间段
sar -u -f /var/log/sysstat/sa$(date -d yesterday +%d) -b 14:00 -e 16:00
# 3. 查看内存
sar -r -f /var/log/sysstat/sa$(date -d yesterday +%d) -b 14:00 -e 16:00
# 4. 查看磁盘
sar -d -f /var/log/sysstat/sa$(date -d yesterday +%d) -b 14:00 -e 16:00
场景6:性能基准测试
需求:记录系统性能基线
#!/bin/bash
# baseline_test.sh
LOG_FILE="/tmp/baseline_$(date +%Y%m%d_%H%M%S).log"
echo "=== 性能基线测试 ===" | tee $LOG_FILE
echo "时间: $(date)" | tee -a $LOG_FILE
echo "--- CPU ---" | tee -a $LOG_FILE
sar -u 1 10 | tee -a $LOG_FILE
echo "--- 内存 ---" | tee -a $LOG_FILE
sar -r 1 10 | tee -a $LOG_FILE
echo "--- 磁盘 ---" | tee -a $LOG_FILE
sar -d 1 10 | tee -a $LOG_FILE
echo "--- 网络 ---" | tee -a $LOG_FILE
sar -n DEV 1 10 | tee -a $LOG_FILE
echo "--- 负载 ---" | tee -a $LOG_FILE
sar -q 1 10 | tee -a $LOG_FILE
echo "=== 测试完成 ===" | tee -a $LOG_FILE
echo "报告保存在: $LOG_FILE"
8.8 高级技巧
8.8.1 输出格式化
# JSON格式(sysstat 12+)
sar -u -o JSON 1 5
# 带时间戳
sar -t -u 1 5
# 宽输出
sar -W -u 1 5
8.8.2 数据过滤
# 使用awk过滤
sar -u 1 5 | awk '$NF < 50 {print}'
# 使用grep过滤
sar -d 1 5 | grep "sda"
# 高亮异常值
sar -u 1 5 | awk '{if($NF < 30) print "\033[31m" $0 "\033[0m"; else print}'
8.8.3 图形化输出
# 使用sadf生成SVG
sadf -g /var/log/sysstat/sa10 > /tmp/sar_graph.svg
# 使用ksar(Java工具)
# 需要安装Java
java -jar kSar.jar -input /var/log/sysstat/sar10
8.9 故障排查
问题1:SAR没有数据
# 检查sysstat服务
sudo systemctl status sysstat
# 启用服务
sudo systemctl enable sysstat
sudo systemctl start sysstat
# 手动收集一次
sudo /usr/lib/sysstat/sa1 1 1
# 检查cron
cat /etc/cron.d/sysstat
问题2:数据文件损坏
# 检查文件
ls -la /var/log/sysstat/
# 修复数据
sudo /usr/lib/sysstat/sadc -F -f /var/log/sysstat/sa10
# 重新生成报告
sudo /usr/lib/sysstat/sa2 -A
问题3:磁盘空间不足
# 查看数据大小
du -sh /var/log/sysstat/
# 减少保留天数
sudo nano /etc/sysstat/sysstat
# HISTORY=14
# 清理旧数据
find /var/log/sysstat/ -name "sa*" -mtime +30 -delete
find /var/log/sysstat/ -name "sar*" -mtime +30 -delete
8.10 性能开销
| 工具 | CPU占用 | 内存占用 | 磁盘占用(SAR) |
|---|---|---|---|
| vmstat | <0.1% | <1MB | N/A |
| iostat | <0.1% | <1MB | N/A |
| mpstat | <0.1% | <1MB | N/A |
| SAR | <0.5% | <5MB | ~100MB/月 |
8.11 扩展阅读
8.12 快速参考
vmstat快速参考
vmstat 1 5 # 每秒刷新,共5次
vmstat -a 1 # 显示活跃/非活跃内存
vmstat -d 1 # 磁盘统计
vmstat -s # 内存摘要
iostat快速参考
iostat # 基本统计
iostat -x # 扩展统计
iostat -x 1 # 持续监控
iostat -m # 以MB为单位
iostat -p sda # 包含分区
mpstat快速参考
mpstat # 所有CPU统计
mpstat -P ALL 1 # 每个CPU核心
mpstat -I ALL 1 # 中断统计
SAR快速参考
# 实时监控
sar -u 1 5 # CPU
sar -r 1 5 # 内存
sar -d 1 5 # 磁盘
sar -n DEV 1 5 # 网络
sar -q 1 5 # 负载
# 历史数据
sar -u -f sa10 # 10号CPU数据
sar -u -b 14:00 # 从14:00开始
8.13 本章小结
本章详细介绍了系统级监控工具:
vmstat - 虚拟内存统计
- 进程、内存、IO、CPU综合监控
- 快速识别系统瓶颈
iostat - IO统计
- 磁盘IO详细分析
- 识别IO瓶颈
mpstat - 多处理器统计
- 每个CPU核心的详细统计
- 中断分析
SAR - 系统活动报告
- 历史数据收集和回放
- 全面的系统监控
这些工具是系统性能分析的基础,掌握它们能快速定位各种性能问题。
上一章: 第7章:nload与vnstat 下一章: 第9章:Glances详解