强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

系统监控工具指南 / 第8章:vmstat/iostat/SAR

第8章:vmstat/iostat/SAR

8.1 概述

工具定位

工具全称主要用途
vmstatVirtual Memory Statistics虚拟内存统计
iostatIO StatisticsIO统计
mpstatMultiprocessor Statistics多处理器统计
SARSystem Activity Reporter系统活动报告

为什么学习这些工具

  1. 系统自带 - 无需额外安装
  2. 轻量高效 - 资源消耗极低
  3. 脚本友好 - 适合自动化监控
  4. 历史数据 - SAR支持长期记录

工具对比

特性vmstatiostatmpstatSAR
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%
waIO等待<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>20msIO延迟高
avgqu-sz<1>2请求排队
r/s + w/s取决于磁盘SSD: >10000超出磁盘能力

不同磁盘的IO能力

磁盘类型IOPS(随机读写)吞吐量(顺序读写)
SATA HDD100-200100-200 MB/s
SAS HDD200-300200-300 MB/s
SATA SSD10000-50000500-550 MB/s
NVMe SSD100000-5000003000-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用户空间占用
%nicenice值调整的进程
%sys内核空间占用
%iowaitIO等待
%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%<1MBN/A
iostat<0.1%<1MBN/A
mpstat<0.1%<1MBN/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 本章小结

本章详细介绍了系统级监控工具:

  1. vmstat - 虚拟内存统计

    • 进程、内存、IO、CPU综合监控
    • 快速识别系统瓶颈
  2. iostat - IO统计

    • 磁盘IO详细分析
    • 识别IO瓶颈
  3. mpstat - 多处理器统计

    • 每个CPU核心的详细统计
    • 中断分析
  4. SAR - 系统活动报告

    • 历史数据收集和回放
    • 全面的系统监控

这些工具是系统性能分析的基础,掌握它们能快速定位各种性能问题。


上一章: 第7章:nload与vnstat 下一章: 第9章:Glances详解