4. 测试工具链:perf、sysbench、fio、unixbench、vmstat、iostat、sar的安装与基础使用
性能基准测试的准确性高度依赖工具链的完整性与正确使用。本章将系统介绍虚拟化优化场景下最核心的七款工具:perf(CPU性能计数器与采样)、sysbench(多维度负载生成)、fio(存储IO基准)、UnixBench(综合系统评分)、vmstat(虚拟内存与进程状态)、iostat(块设备IO统计)以及sar(系统活动报告)。每款工具均涵盖安装方法、基础命令范式及典型输出解读。
4.1 工具全景与选型矩阵
在虚拟化环境中,不同测试目标对应不同的工具组合。下表总结了各工具的核心用途与适用场景:
| 工具 | 核心用途 | 典型场景 | 输出粒度 |
|---|---|---|---|
| perf | CPU硬件计数器、采样、跟踪 | 热点函数定位、缓存命中率、分支预测 | 纳秒级/事件级 |
| sysbench | CPU/内存/文件IO/数据库负载生成 | 虚拟机CPU算力、内存带宽、OLTP模拟 | 吞吐量/延迟分布 |
| fio | 块设备IO性能测试 | 磁盘/SSD/NVMe IOPS、延迟、带宽 | 单线程/多线程/队列深度 |
| UnixBench | 综合系统性能评分 | 宿主机与虚拟机对比、内核优化前后对比 | 单核/多核指数 |
| vmstat | 系统进程、内存、分页、CPU统计 | 实时监控、瓶颈快速定位 | 秒级采样 |
| iostat | 块设备IO统计 | 磁盘利用率、IO队列、服务时间 | 秒级/事务级 |
| sar | 系统活动历史记录与实时报告 | 长期性能趋势、异常回溯 | 分钟级/小时级 |
4.2 perf:CPU性能计数器与采样分析
perf 是 Linux 内核自带的性能分析工具,基于 perf_event_open 系统调用,能够访问 CPU 硬件性能计数器和内核跟踪点。在虚拟化环境中,perf 可以穿透 KVM 访客模式,直接测量物理 CPU 的行为。
4.2.1 安装
# Debian/Ubuntu
sudo apt-get install linux-tools-common linux-tools-$(uname -r)
# RHEL/CentOS
sudo yum install perf
# 验证安装
perf --version
4.2.2 基础使用
perf 提供多种子命令,最常用的包括 stat(计数)、record/report(采样)和 top(实时热点)。
# 统计 ls 命令的CPU周期和指令数
perf stat ls
# 采样运行中的进程(PID 1234),持续10秒
perf record -p 1234 -a -g -- sleep 10
# 生成报告
perf report
# 实时查看CPU热点
perf top
4.2.3 虚拟化相关事件
在 KVM 环境中,perf 可以监控 VM-Exit 次数、EPT 违规等虚拟化特有事件:
# 列出所有可用事件
perf list
# 监控KVM特定事件(需内核支持)
perf stat -e kvm:kvm_exit,kvm:kvm_entry -a -- sleep 5
kvm:kvm_exit 事件频率过高意味着频繁的VM退出,通常由IO操作、中断注入或MMIO访问引起。优化目标是将VM-Exit率降低到每秒10万次以下(视工作负载而定)。
4.3 sysbench:多维度负载生成器
sysbench 是一款模块化、跨平台的基准测试工具,支持 CPU、内存、文件 I/O 和数据库(MySQL/PostgreSQL)负载。在虚拟化优化中,常用其 CPU 和内存测试评估虚拟机计算能力。
4.3.1 安装
# Debian/Ubuntu
sudo apt-get install sysbench
# RHEL/CentOS
sudo yum install sysbench
# 验证
sysbench --version
4.3.2 CPU 测试
# 单线程CPU素数计算测试
sysbench cpu run
# 多线程CPU测试(4线程,最大素数上限20000)
sysbench cpu --threads=4 --cpu-max-prime=20000 run
输出关键字段:total time(总耗时)、events per second(每秒事件数,即吞吐量)。
4.3.3 内存测试
# 内存读取带宽测试(1GB块,单线程)
sysbench memory --memory-block-size=1G --memory-total-size=10G run
# 内存写入测试
sysbench memory --memory-block-size=1G --memory-total-size=10G --memory-oper=write run
4.3.4 文件IO测试
# 准备测试文件(128个文件,每个16MB)
sysbench fileio --file-num=128 --file-total-size=2G prepare
# 随机读写测试
sysbench fileio --file-num=128 --file-total-size=2G --file-test-mode=rndrw run
# 清理
sysbench fileio --file-num=128 --file-total-size=2G cleanup
--file-extra-flags=direct 参数。在虚拟化环境中,建议同时测试 buffered 和 direct 两种模式,以区分宿主机缓存和虚拟机缓存的影响。
4.4 fio:存储IO性能基准
fio(Flexible I/O Tester)是存储性能测试的行业标准工具,支持异步 I/O、libaio、io_uring 等多种引擎,能够精确控制队列深度、块大小、读写比例和延迟分布。
4.4.1 安装
# Debian/Ubuntu
sudo apt-get install fio
# RHEL/CentOS
sudo yum install fio
# 验证
fio --version
4.4.2 基础命令范式
# 4K随机写入,队列深度32,直接I/O,持续60秒
fio --name=randwrite --ioengine=libaio --iodepth=32 \
--rw=randwrite --bs=4k --direct=1 --size=1G \
--numjobs=1 --runtime=60 --time_based \
--filename=/tmp/test.fio
# 128K顺序读取,队列深度8
fio --name=seqread --ioengine=libaio --iodepth=8 \
--rw=read --bs=128k --direct=1 --size=4G \
--numjobs=1 --runtime=30 --time_based \
--filename=/tmp/test.fio
4.4.3 输出解读
fio 输出包含丰富的性能指标:
| 字段 | 含义 | 优化关注点 |
|---|---|---|
| IOPS | 每秒I/O操作数 | 虚拟化场景下应接近裸机90%以上 |
| BW | 带宽(MB/s) | 受限于虚拟化IO栈开销 |
| clat (us) | 完成延迟(微秒) | P99延迟应低于裸机2倍 |
| slat (us) | 提交延迟(微秒) | 反映IO路径软件开销 |
| lat (us) | 总延迟 | clat + slat |
4.5 UnixBench:综合系统评分
UnixBench 是一套经典的 Unix 系统性能基准测试套件,包含 Dhrystone(整数运算)、Whetstone(浮点运算)、Execl Throughput(进程创建)、File Copy(文件IO)、Pipe Throughput(进程间通信)等多项测试,最终输出单核与多核指数。
4.5.1 安装
# 下载源码编译
wget https://github.com/kdlucas/byte-unixbench/archive/v5.1.3.tar.gz
tar xzf v5.1.3.tar.gz
cd byte-unixbench-5.1.3/UnixBench
make
# 运行(默认2个并行副本)
./Run
# 指定并行副本数(通常等于CPU核心数)
./Run -c 4
4.5.2 输出解读
UnixBench 输出包含每个子测试的分数和最终指数:
System Benchmarks Index Values (BASELINE = 1.0):
Dhrystone 2 using register variables : 12345.6
Double-Precision Whetstone : 6789.0
Execl Throughput : 2345.6
File Copy 1024 bufsize 2000 maxblocks : 4567.8
Pipe Throughput : 8901.2
System Benchmarks Index Score : 5678.9
4.6 vmstat:虚拟内存与进程状态
vmstat 是 sysstat 包中的轻量级监控工具,实时报告进程、内存、分页、块IO、中断和CPU活动。在虚拟化环境中,vmstat 可用于快速定位 CPU 瓶颈、内存压力或IO等待。
4.6.1 安装
# 通常系统自带,若缺失:
sudo apt-get install procps # Debian/Ubuntu
sudo yum install procps-ng # RHEL/CentOS
4.6.2 基础使用
# 每2秒采样一次,共5次
vmstat 2 5
# 显示磁盘IO统计
vmstat -d
# 显示内存统计详情
vmstat -s
4.6.3 关键字段解读
| 字段 | 含义 | 虚拟化关注点 |
|---|---|---|
| r | 运行队列中的进程数 | 超过CPU核心数表示CPU饱和 |
| b | 不可中断睡眠进程数 | 高值表示IO瓶颈 |
| swpd | 交换空间使用量 | 虚拟机关闭内存过量使用时应接近0 |
| si/so | 换入/换出页数 | 非零值表示内存压力 |
| us/sy/id/wa | CPU用户/系统/空闲/等待IO时间 | wa高表示存储IO瓶颈 |
4.7 iostat:块设备IO统计
iostat 专注于块设备的IO统计,提供设备级别的利用率、吞吐量、IO队列长度和服务时间。在虚拟化存储优化中,iostat 是区分宿主机与虚拟机IO行为的必备工具。
4.7.1 安装
# 包含在sysstat包中
sudo apt-get install sysstat # Debian/Ubuntu
sudo yum install sysstat # RHEL/CentOS
4.7.2 基础使用
# 每2秒采样一次,显示扩展统计
iostat -x 2
# 仅显示某个设备
iostat -x sda 2
# 显示设备名称、IOPS、带宽、平均队列长度、平均服务时间
iostat -x -k 2
4.7.3 关键字段解读
| 字段 | 含义 | 优化目标 |
|---|---|---|
| r/s, w/s | 每秒读/写请求数 | 反映IOPS |
| rkB/s, wkB/s | 每秒读/写数据量 | 反映带宽 |
| avgqu-sz | 平均IO队列长度 | 高值表示设备饱和 |
| await | 平均IO响应时间(ms) | 虚拟化场景应低于10ms |
| svctm | 平均服务时间(ms) | 接近await表示无排队 |
| %util | 设备利用率 | 接近100%表示瓶颈 |
%util 很高但 await 正常,说明虚拟机内部IO路径正常,瓶颈可能在宿主机存储层。此时应在宿主机上同时运行 iostat,对比 avgqu-sz 和 await 的差异。
4.8 sar:系统活动报告
sar(System Activity Reporter)是 sysstat 包的核心组件,能够收集、报告和保存系统活动数据,包括CPU、内存、IO、网络、上下文切换等。在虚拟化优化中,sar 适合做长时间的性能趋势分析。
4.8.1 安装与配置
# 安装sysstat后,启用数据收集
sudo systemctl enable sysstat
sudo systemctl start sysstat
# 默认数据收集间隔为10分钟,数据保存在 /var/log/sysstat/
4.8.2 基础使用
# 实时查看CPU统计(每2秒一次)
sar -u 2 5
# 查看内存使用
sar -r 2 5
# 查看IO统计
sar -b 2 5
# 查看网络统计
sar -n DEV 2 5
# 查看历史数据(当天)
sar -u -f /var/log/sysstat/sa$(date +%d)
# 查看特定日期的历史数据
sar -u -f /var/log/sysstat/sa12
4.8.3 虚拟化场景常用组合
# 综合监控:CPU + 内存 + IO + 上下文切换
sar -u -r -b -w 5 10
# 查看平均负载
sar -q 5 10
# 查看大页使用情况
sar -H 5 10
4.9 工具链集成使用示例
以下是一个完整的虚拟化性能测试脚本框架,展示如何组合使用上述工具:
#!/bin/bash
# 虚拟化性能基准测试脚本示例
# 用法:./benchmark.sh [测试名称]
TEST_NAME=${1:-"default_test"}
OUTPUT_DIR="./results/${TEST_NAME}"
mkdir -p ${OUTPUT_DIR}
# 1. 启动后台监控
sar -u -r -b -w 5 > ${OUTPUT_DIR}/sar.log &
SAR_PID=$!
vmstat 5 > ${OUTPUT_DIR}/vmstat.log &
VMSTAT_PID=$!
iostat -x 5 > ${OUTPUT_DIR}/iostat.log &
IOSTAT_PID=$!
# 2. 运行负载测试
echo "=== CPU 测试 ==="
sysbench cpu --threads=4 --cpu-max-prime=20000 run > ${OUTPUT_DIR}/sysbench_cpu.log
echo "=== 内存测试 ==="
sysbench memory --memory-block-size=1G --memory-total-size=10G run > ${OUTPUT_DIR}/sysbench_mem.log
echo "=== 文件IO测试 ==="
sysbench fileio --file-num