Fio 磁盘性能基准测试教程
Fio(Flexible I/O Tester)是 Linux 下最专业的磁盘性能基准测试工具,由 Linux 内核块设备层维护者 Jens Axboe 开发。它可以模拟各种 I/O 工作负载,精确测量磁盘的 IOPS(每秒输入输出操作数)、吞吐量(带宽)和延迟等关键性能指标。无论是评估搬瓦工 VPS 的磁盘性能,还是选择合适的存储方案,fio 都是不可或缺的测试工具。
一、安装 Fio
1.1 在 Ubuntu/Debian 上安装
apt update
apt install fio -y
fio --version
1.2 在 CentOS/RHEL 上安装
yum install fio -y
二、Fio 基本概念
在开始测试之前,需要了解几个核心概念:
- IOPS:每秒 I/O 操作次数,反映磁盘处理随机小文件的能力,是数据库等应用的关键指标。
- 吞吐量(Bandwidth):每秒传输的数据量(MB/s 或 GB/s),反映磁盘处理大文件的能力。
- 延迟(Latency):单次 I/O 操作的完成时间,分为提交延迟(slat)、完成延迟(clat)和总延迟(lat)。
- 队列深度(iodepth):同时发出的 I/O 请求数量,影响并发性能。
- 块大小(bs):每次 I/O 操作的数据量,常见为 4K(随机)和 1M(顺序)。
三、常用测试场景
3.1 顺序读取测试
fio --name=seq-read \
--ioengine=libaio \
--iodepth=32 \
--rw=read \
--bs=1M \
--direct=1 \
--size=1G \
--numjobs=1 \
--runtime=60 \
--time_based \
--filename=/tmp/fio-test
3.2 顺序写入测试
fio --name=seq-write \
--ioengine=libaio \
--iodepth=32 \
--rw=write \
--bs=1M \
--direct=1 \
--size=1G \
--numjobs=1 \
--runtime=60 \
--time_based \
--filename=/tmp/fio-test
3.3 随机读取测试(4K IOPS)
fio --name=rand-read \
--ioengine=libaio \
--iodepth=64 \
--rw=randread \
--bs=4k \
--direct=1 \
--size=1G \
--numjobs=4 \
--runtime=60 \
--time_based \
--group_reporting \
--filename=/tmp/fio-test
3.4 随机写入测试(4K IOPS)
fio --name=rand-write \
--ioengine=libaio \
--iodepth=64 \
--rw=randwrite \
--bs=4k \
--direct=1 \
--size=1G \
--numjobs=4 \
--runtime=60 \
--time_based \
--group_reporting \
--filename=/tmp/fio-test
3.5 混合随机读写测试(70% 读 30% 写)
fio --name=randrw \
--ioengine=libaio \
--iodepth=32 \
--rw=randrw \
--rwmixread=70 \
--bs=4k \
--direct=1 \
--size=1G \
--numjobs=4 \
--runtime=60 \
--time_based \
--group_reporting \
--filename=/tmp/fio-test
四、使用配置文件
对于复杂的测试场景,可以使用配置文件代替命令行参数。创建 fio-test.ini 文件:
[global]
ioengine=libaio
direct=1
size=1G
runtime=60
time_based
group_reporting
filename=/tmp/fio-test
[seq-read]
rw=read
bs=1M
iodepth=32
numjobs=1
[seq-write]
rw=write
bs=1M
iodepth=32
numjobs=1
[rand-read-4k]
rw=randread
bs=4k
iodepth=64
numjobs=4
[rand-write-4k]
rw=randwrite
bs=4k
iodepth=64
numjobs=4
运行配置文件:
fio fio-test.ini
五、解读测试结果
fio 的输出信息比较丰富,以下是需要关注的关键数据:
# 输出示例片段
rand-read-4k: (groupid=0, jobs=4): err= 0
read: IOPS=45.2k, BW=176MiB/s (185MB/s)
slat (usec): min=2, max=120, avg= 5.80
clat (usec): min=50, max=12500, avg=350.20
lat (usec): min=55, max=12520, avg=356.00
bw ( KiB/s): min=160000, max=195000, avg=180500.00
iops : min=40000, max=48750, avg=45125.00
- IOPS:45.2k 表示每秒 45200 次随机读操作。
- BW(Bandwidth):176MiB/s 的吞吐量。
- clat(完成延迟):平均 350.20 微秒,这是最常关注的延迟指标。
- lat(总延迟):包含提交和完成延迟的总时间。
六、VPS 磁盘性能快速测试脚本
#!/bin/bash
# VPS 磁盘性能快速测试脚本
echo "===== VPS 磁盘性能测试 ====="
echo "测试时间: $(date)"
echo ""
TEST_FILE="/tmp/fio-benchmark"
echo "--- 顺序读取 ---"
fio --name=seq-read --ioengine=libaio --iodepth=32 --rw=read --bs=1M --direct=1 --size=512M --numjobs=1 --runtime=30 --time_based --filename=${TEST_FILE} --output-format=terse | awk -F';' '{printf "带宽: %.2f MB/s\n", $7/1024}'
echo "--- 顺序写入 ---"
fio --name=seq-write --ioengine=libaio --iodepth=32 --rw=write --bs=1M --direct=1 --size=512M --numjobs=1 --runtime=30 --time_based --filename=${TEST_FILE} --output-format=terse | awk -F';' '{printf "带宽: %.2f MB/s\n", $48/1024}'
echo "--- 4K 随机读取 ---"
fio --name=rand-read --ioengine=libaio --iodepth=64 --rw=randread --bs=4k --direct=1 --size=512M --numjobs=1 --runtime=30 --time_based --filename=${TEST_FILE} --output-format=terse | awk -F';' '{printf "IOPS: %s, 带宽: %.2f MB/s\n", $8, $7/1024}'
echo "--- 4K 随机写入 ---"
fio --name=rand-write --ioengine=libaio --iodepth=64 --rw=randwrite --bs=4k --direct=1 --size=512M --numjobs=1 --runtime=30 --time_based --filename=${TEST_FILE} --output-format=terse | awk -F';' '{printf "IOPS: %s, 带宽: %.2f MB/s\n", $49, $48/1024}'
# 清理测试文件
rm -f ${TEST_FILE}
echo ""
echo "测试完成!"
七、JSON 输出与可视化
# 以 JSON 格式输出结果
fio --name=test --ioengine=libaio --iodepth=32 --rw=randread --bs=4k --direct=1 --size=1G --runtime=60 --time_based --filename=/tmp/fio-test --output-format=json --output=result.json
# 使用 jq 提取关键信息
jq '.jobs[0].read | {iops: .iops, bw_bytes: .bw_bytes, lat_ns: .lat_ns.mean}' result.json
八、常见问题
8.1 测试结果不准确
确保使用 --direct=1 参数绕过操作系统的页面缓存,否则测试的是内存性能而非磁盘性能。同时使用 --time_based 和 --runtime 保证测试运行足够的时间。
8.2 libaio 引擎不可用
# 安装 libaio 库
apt install libaio-dev -y # Ubuntu/Debian
yum install libaio-devel -y # CentOS
# 如果仍然不可用,可以使用 posixaio 或 sync 引擎替代
fio --name=test --ioengine=posixaio --rw=randread --bs=4k --direct=1 --size=1G --filename=/tmp/fio-test
8.3 清理测试文件
# 测试完成后删除测试文件
rm -f /tmp/fio-test
总结
Fio 是评估磁盘性能最专业的工具,通过不同的测试场景可以全面了解磁盘在各种工作负载下的表现。建议在购买搬瓦工 VPS 后使用 fio 进行基准测试,与其他同类型 VPS 的性能数据进行对比。更多系统性能测试可以参考 Sysbench 系统基准测试教程。选购搬瓦工 VPS 请参考 全部方案,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的优惠,通过 bwh81.net 进入官网购买。