共计 1730 个字符,预计需要花费 5 分钟才能阅读完成。
为什么需要基准测试
- 基准测试是存储系统性能的照妖镜,能暴露硬件瓶颈和软件配置问题
- 量化评估存储设备的真实能力,避免 ” 理论性能 ” 误导决策
- 为容量规划、参数调优提供数据支撑,降低生产环境风险
Attu 测试工具原理
基于 fio(Flexible I/O Tester) 引擎实现,通过用户态直接控制 I / O 调度,绕过文件系统缓存获取真实磁盘性能。核心工作机制:

- 线程池模型:每个 job 对应独立 I / O 线程,避免测试进程成为瓶颈
- I/ O 模式控制:支持随机 / 顺序、读 / 写 / 混合、同步 / 异步等 16 种组合
- 内存锁定:使用 mlock 避免 page cache 影响测试结果准确性
关键指标解读
IOPS(Input/Output Operations Per Second)
- 计算公式:
IOPS = (队列深度×完成次数) / 耗时 - 随机读写场景下的核心指标,体现硬盘的并发处理能力
吞吐量 (Throughput)
- 计算公式:
吞吐量 = IOPS × I/ O 大小 - 顺序读写场景的关键指标,单位通常为 MB/s
延迟 (Latency)
- 包含三部分:
服务时间 + 排队时间 + 传输时间 - 95th/99th 百分位延迟对业务体验影响最大
三者关系示例(测试环境:NVMe SSD 1TB):
| 队列深度 | IOPS | 吞吐量 | 平均延迟 |
|----------|--------|--------|----------|
| 1 | 18K | 72MB/s | 54μs |
| 32 | 520K | 2GB/s | 61μs |
测试参数配置模板
4K 随机读(模拟数据库负载)
[global]
ioengine=libaio # 使用 Linux 原生异步 I /O
direct=1 # 绕过系统缓存
time_based=1 # 按时间而非次数运行
runtime=300 # 测试 5 分钟
[4k-random-read]
rw=randread # 随机读模式
bs=4k # 4K 块大小
directory=/mnt/test # 测试路径
numjobs=4 # 并发线程数
iodepth=16 # 队列深度
1M 顺序写(适合大数据场景)
[1m-seq-write]
rw=write
bs=1m
size=100g # 预分配 100GB 测试文件
iodepth=8
thread # 使用线程而非进程
性能瓶颈定位方法
iostat 监控示例(间隔 1 秒输出)
# -x 显示扩展统计,-d 只显示磁盘,-m 以 MB 为单位
iostat -xdm 1
关键字段解读:
– %util >70% 表示设备繁忙
– await >5ms 需要警惕延迟问题
– svctime 反映物理设备响应速度
dstat 综合监控
dstat -cdngy --disk-util --disk-tps 1
生产环境避坑指南
测试环境隔离
- 物理隔离:专用测试机柜,避免共享电源 / 网络
- 资源隔离:cgroups 限制 CPU/ 内存,taskset 绑定 CPU 核
- 数据隔离:单独分区,测试后立即销毁数据
避免误判的校验技巧
- 三次验证法:异常结果需重复测试至少 3 次
- 交叉验证:同时使用 fio 和 vdbench 工具对比
- 基线比对:与厂商规格书的 70% 性能值对照
文件系统差异
| 项目 | ext4 | xfs |
|---|---|---|
| 元数据开销 | 较高 | 较低 |
| 大文件性能 | 一般 | 优秀 |
| 碎片化影响 | 明显 | 几乎无 |
自动化测试脚本片段
#!/bin/bash
TEST_DIR=/mnt/test
FIO_CMD="fio --output-format=json"
cleanup() {rm -f ${TEST_DIR}/fio_test_file
umount ${TEST_DIR} 2>/dev/null
}
run_test() {
local config=$1
if ! ${FIO_CMD} ${config} > result.json; then
echo "测试失败,错误码:$?" >&2
cleanup
exit 1
fi
# 提取关键指标
jq '.jobs[0].read.iops, .jobs[0].write.iops' result.json
}
trap cleanup EXIT
run_test random_read.fio
开放性问题
- 混合读写场景设计:如何平衡读写比例?怎样模拟真实业务的 I / O 模式?
- 业务关联建模:当测试显示 10K IOPS 时,实际能支撑多少用户并发查询?
(测试环境说明:所有数据基于 Intel D7-P5510 SSD,Xeon Silver 4210R CPU,CentOS 8.4 内核 5.10)
正文完
