fio
(Flexible I/O Tester)是一个强大的工具,用于测试磁盘 I/O 性能。它支持多种 I/O 引擎、工作负载模式和测试场景,可以帮助你评估磁盘的读写性能、延迟、吞吐量等指标。
以下是使用 fio
进行磁盘测试的基本步骤和常用命令:
1. 安装 fio
在大多数 Linux 发行版中,可以通过包管理器安装 fio
:
-
Debian/Ubuntu:
sudo apt update sudo apt install fio
-
CentOS/RHEL:
sudo yum install fio
-
Fedora:
sudo dnf install fio
-
Arch Linux:
sudo pacman -S fio
2. 基本用法
fio
通过配置文件或命令行参数指定测试参数。以下是一些常用的测试场景和命令。
2.1 随机读测试
测试随机读取性能:
fio --name=random-read --ioengine=libaio --rw=randread --bs=4k --direct=1 --size=1G --numjobs=1 --runtime=60 --time_based --group_reporting
--name
:测试名称。--ioengine
:I/O 引擎,libaio
是异步 I/O 引擎。--rw
:读写模式,randread
表示随机读。--bs
:块大小,4k
表示每次 I/O 操作 4KB。--direct
:绕过缓存,直接访问磁盘。--size
:测试文件大小。--numjobs
:并发任务数。--runtime
:测试运行时间(秒)。--time_based
:基于时间运行测试。--group_reporting
:汇总所有任务的测试结果。
2.2 随机写测试
测试随机写入性能:
fio --name=random-write --ioengine=libaio --rw=randwrite --bs=4k --direct=1 --size=1G --numjobs=1 --runtime=60 --time_based --group_reporting
2.3 顺序读测试
测试顺序读取性能:
fio --name=sequential-read --ioengine=libaio --rw=read --bs=1M --direct=1 --size=1G --numjobs=1 --runtime=60 --time_based --group_reporting
2.4 顺序写测试
测试顺序写入性能:
fio --name=sequential-write --ioengine=libaio --rw=write --bs=1M --direct=1 --size=1G --numjobs=1 --runtime=60 --time_based --group_reporting
2.5 混合读写测试
测试混合读写性能(例如 70% 读,30% 写):
fio --name=mixed-io --ioengine=libaio --rw=randrw --rwmixread=70 --bs=4k --direct=1 --size=1G --numjobs=1 --runtime=60 --time_based --group_reporting
3. 使用配置文件
fio
支持通过配置文件定义测试参数。例如,创建一个名为 fio-test.fio
的文件:
[global]
ioengine=libaio
direct=1
size=1G
runtime=60
time_based
group_reporting[random-read]
rw=randread
bs=4k
numjobs=1[random-write]
rw=randwrite
bs=4k
numjobs=1
然后运行测试:
fio fio-test.fio
4. 测试结果解读
fio
测试完成后会输出详细的性能数据,主要包括以下指标:
- IOPS:每秒 I/O 操作数(Input/Output Operations Per Second)。
- 带宽(BW):吞吐量,通常以 MB/s 为单位。
- 延迟(lat):I/O 操作的延迟时间,通常以微秒(us)或毫秒(ms)为单位。
例如:
read: IOPS=10k, BW=40MiB/s (42MB/s)
write: IOPS=5k, BW=20MiB/s (21MB/s)
5. 高级用法
5.1 多任务并发
通过 --numjobs
参数可以设置多个并发任务,模拟多线程或多进程的 I/O 负载:
fio --name=random-read --ioengine=libaio --rw=randread --bs=4k --direct=1 --size=1G --numjobs=4 --runtime=60 --time_based --group_reporting
5.2 测试特定设备
如果需要对特定设备(如 /dev/sdb
)进行测试,可以使用 --filename
参数:
fio --name=random-read --ioengine=libaio --rw=randread --bs=4k --direct=1 --filename=/dev/sdb --size=1G --numjobs=1 --runtime=60 --time_based --group_reporting
5.3 测试文件系统
如果需要对文件系统进行测试,可以指定一个文件路径:
fio --name=random-read --ioengine=libaio --rw=randread --bs=4k --direct=1 --filename=/mnt/testfile --size=1G --numjobs=1 --runtime=60 --time_based --group_reporting
6. 注意事项
- 数据安全:如果直接测试裸设备(如
/dev/sdb
),会覆盖设备上的数据,请确保设备上没有重要数据。 - 缓存影响:使用
--direct=1
可以绕过缓存,确保测试结果反映真实的磁盘性能。 - 测试规模:根据磁盘容量和性能调整
--size
参数,避免测试时间过长或过短。
通过以上方法可以使用 fio
对磁盘进行全面的性能测试。如果需要更复杂的测试场景,可以参考 fio
的官方文档或使用 man fio
查看详细参数说明。