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 进入官网购买。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。