fio工具概述与磁盘I/O性能测试基础
fio(Flexible I/O Tester)是Linux系统下最权威的磁盘I/O性能测试工具,支持多种I/O引擎、读写模式和访问模式。服务器运维中评估存储子系统性能时,fio是业界标准工具。通过模拟真实工作负载,fio可以精确测量IOPS、吞吐量(MB/s)和延迟(us/ms),为存储选型和性能调优提供数据支撑。
磁盘I/O性能测试需要区分几个核心概念:顺序读写衡量的是吞吐量(MB/s),反映大文件传输能力;随机读写衡量的是IOPS(每秒I/O操作数),反映小文件并发处理能力;延迟(latency)包括平均延迟和尾延迟(P99、P999),直接影响应用响应速度。fio通过灵活的参数组合,可以覆盖所有这些测试场景。
fio核心配置参数详解
fio的配置参数有近百个,以下列出最关键的一组参数及其含义:
# 顺序读测试配置示例
[global]
ioengine=libaio # I/O引擎,libaio为Linux原生异步I/O
direct=1 # 绕过page cache,直接操作磁盘
rw=read # 读写模式:read/write/randread/randwrite/rw
bs=128k # 块大小,影响吞吐量和IOPS
iodepth=32 # I/O队列深度,并发请求数
numjobs=4 # 并发job数
size=10G # 测试文件大小
runtime=60 # 每个job运行时间(秒)
time_based # 按时间运行
group_reporting # 汇总多job结果
filename=/dev/nvme0n1 # 测试目标,可用设备路径或文件路径
name=seq_read
ioengine参数决定I/O提交方式。libaio是Linux内核原生异步I/O引擎,配合direct=1使用,测试结果最接近硬件真实性能。sync是同步I/O引擎,iodepth参数对其无效。mmap通过内存映射文件方式访问,适合测试文件系统层性能。direct=1确保I/O请求不经过操作系统page cache缓冲,直接写入存储设备,这一参数对评估裸盘性能至关重要。
bs(block size)参数对测试结果影响极大。大bs值(如128k、1M)测试的是吞吐量上限,小bs值(如4k)测试的是IOPS上限。iodepth控制I/O队列深度,SSD/NVMe设备的队列深度通常设置为32-128才能打满设备性能。传统机械硬盘iodepth设为1-4即可,设置过高反而增加延迟。
四种典型I/O场景测试方案
完整的磁盘性能评估需要覆盖四种场景:顺序读、顺序写、随机读、随机写。每种场景使用不同的参数组合:
# 1. 顺序读吞吐量测试
fio --name=seq_read --ioengine=libaio --direct=1 --rw=read --bs=1M --iodepth=32 --numjobs=1 --size=10G --runtime=60 --time_based --filename=/dev/nvme0n1 --group_reporting
# 2. 随机读IOPS测试
fio --name=rand_read --ioengine=libaio --direct=1 --rw=randread --bs=4k --iodepth=128 --numjobs=4 --size=10G --runtime=60 --time_based --filename=/dev/nvme0n1 --group_reporting
# 3. 随机写IOPS测试
fio --name=rand_write --ioengine=libaio --direct=1 --rw=randwrite --bs=4k --iodepth=128 --numjobs=4 --size=10G --runtime=60 --time_based --filename=/dev/nvme0n1 --group_reporting
# 4. 混合读写测试(70%读+30%写)
fio --name=mixed_rw --ioengine=libaio --direct=1 --rw=randrw --rwmixread=70 --bs=4k --iodepth=64 --numjobs=4 --size=10G --runtime=60 --time_based --filename=/dev/nvme0n1 --group_reporting
顺序读写测试使用1M块大小和单job,目的是消除并发干扰,测量设备在最佳情况下的吞吐量上限。随机读写测试使用4k块大小和高并发(numjobs=4 + iodepth=128),因为SSD的IOPS性能需要足够的并发请求才能充分体现。混合读写测试模拟数据库等OLTP场景的真实负载特征。
fio测试结果解读与性能分析
fio运行完成后输出详细的统计信息,重点关注的指标如下:
seq_read: (g=0): rw=read, bs=(R) 1024KiB-1024KiB,
ios=(0) 10240, merge=(0) 0, ticks=(0) 354200
lat (usec): min=31280, max=89540, avg=34780.0, stdev=2100
clat percentiles (usec):
| 1.00th=[32100], 5.00th=[32500],
| 50.00th=[34800], 95.00th=[37800],
| 99.00th=[41200], 99.90th=[45100]
Throughput: read=9876MiB/s, write=0B/s
IOPS: read=9876, write=0
rand_read: (g=0): rw=randread, bs=(R) 4096B-4096B,
ios=(0) 1572864, merge=(0) 0
lat (usec): min=85, max=1820, avg=162.3, stdev=45
clat percentiles (usec):
| 1.00th=[95], 5.00th=[105],
| 50.00th=[150], 95.00th=[220],
| 99.00th=[350], 99.90th=[580]
IOPS: min=984000, max=1012000, avg=995000
解读这组数据:顺序读吞吐量约9.9 GB/s,接近PCIe 4.0 NVMe SSD的理论带宽上限。随机读IOPS约99.5万,这是4个job乘以128 iodepth等于512并发下的数值。P99延迟350us,P99.9延迟580us,对于NVMe SSD属于正常范围。
如果P99延迟远高于平均值(如avg=150us但P99=2000us),通常表明设备存在写放大或GC(垃圾回收)导致的间歇性性能抖动。可以在测试前先做一次全盘顺序写填充(preconditioning),确保SSD进入稳态后再进行随机I/O测试,结果更具参考价值。
不同存储介质的基准性能参考
了解各类存储介质的基准性能范围,有助于判断fio测试结果是否正常。SATA SSD的顺序读取通常在500-550 MB/s(受SATA接口6Gbps带宽限制),随机4K读取IOPS在90,000-100,000。PCIe 4.0 NVMe SSD的顺序读取可达7000 MB/s,随机4K读取IOPS可达1,000,000以上。PCIe 5.0 NVMe SSD的顺序读取带宽可达14,000 MB/s,随机4K读取IOPS可达1,500,000。
企业级SSD与消费级SSD的差异主要在稳态性能和尾延迟。消费级SSD在SLC Cache耗尽后写入速度会骤降至100-200 MB/s,而企业级SSD通过预留空间(OP)和PLSLC模式保持稳定的写入性能。服务器选型中如果工作负载包含持续大文件写入,应选择企业级SSD或配置足够的OP空间。
测试文件系统层性能时,direct=1应改为direct=0,允许I/O经过page cache。同时bs参数可以设置为应用实际的I/O大小。例如数据库场景通常使用8k-16k的块大小,Web服务器多为1k-64k的读写。根据实际负载特征调整测试参数,才能获得有参考价值的性能数据。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-ci-pan-io-xing-neng-ji-zhun-ce-shi-yu-fio-gong-ju-pei/