首页 » 系统相关 » 存储磁盘测试工具fio和dd常用场景

存储磁盘测试工具fio和dd常用场景

Linux 系统中有多种工具可用于测试存储设备的 I/O 性能,以下是主要是OS一般自带的dd或FIO (Flexible I/O Tester),因为数据库是一个对I/O敏感的应用软件,对于云上或虚拟环境有时存储性能不理想,通常需要工具在上线前做基准测试,避免上线后出现数据库性能问题,最近有个客户咨询生产一套达梦DMDPC环境在某云环境IaSS上,业务反应慢的无法接受,怀疑I/O不是很理想, 这里记录几个常用的命令。

一些实时查看I/O性能的工具vmstat, iostat -dx , sar , dstat, iotop -o 等

dd快速检查

简单测试顺序读写速度

示例:

# 测试写入速度
 dd if=/dev/zero of=/mnt/testfile bs=1G count=1 oflag=direct

# 测试读取速度
 dd if=/mnt/testfile of=/dev/null bs=1G count=1 iflag=direct

FIO全面测试

FIO (Flexible I/O Tester) 是一个强大的开源存储性能测试工具,主要用于对磁盘和存储系统进行基准测试和压力测试。支持的读写模式包括顺序读,随机读,顺序写,随机写,混合随机读写,混合顺序读写,在数据库环境中使用 FIO 时,建议配合使用 libaio 的 I/O 引擎进行测试。

主要特点
高度可配置:支持多种I/O模式、块大小、队列深度等参数
多平台支持:可在Linux、Windows、macOS等多种操作系统上运行
多引擎支持:支持同步、异步、内存映射等多种I/O引擎
详细报告:提供丰富的性能统计数据和延迟直方图
线程/进程模型:支持多线程和多进程测试

简单测试示例
 fio --name=test --filename=/tmp/testfile --size=1G --rw=read --bs=4k --direct=1 --ioengine=libaio --iodepth=64 --runtime=60 --time_based

常用参数说明

参数 说明
--name 测试名称
--filename 测试文件路径
--size 测试文件大小
--rw I/O模式(read/write/randread/randwrite/rw/randrw)
--bs 块大小(如4k, 8k, 1M等)
--direct 是否绕过缓存(1=是, 0=否)
--ioengine I/O引擎(libaio, sync, psync, mmap等)
--iodepth I/O队列深度
--runtime 测试运行时间(秒)
--time_based 即使完成所有I/O也继续运行到runtime指定时间
--numjobs 并发作业数
--group_reporting 多个 job 并发时,打印整个 group 的统计值。
--zero_buffers 用0初始化系统buffer
--nrfiles 每个进程生成文件的数量
--lockmem=1g 只使用1g内存进行测试
--rwmixwrite=30 在混合读写的模式下,写占30%

FIO输出结果包含以下关键指标:
IOPS:每秒I/O操作数
带宽(BW):吞吐量(通常以MB/s为单位)
延迟(lat):I/O操作完成时间(通常以us或ms为单位)
CPU使用率:测试期间的CPU利用率

常见测试方案

支持命令行带参数和配置文件复杂的测试场景。

读性能测试用例

#4k随机读
$ fio --bs=4k --ioengine=libaio --iodepth=128 --direct=1 --rw=randwrite --time_based --runtime=300 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-write --size=1G --filename=/dev/vdb

#8k随机读
$ fio --bs=8k --ioengine=libaio --iodepth=128 --direct=1 --rw=randwrite --time_based --runtime=300 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-write --size=1G --filename=/dev/vdb


#1M随机读
$ fio --bs=1m --ioengine=libaio --iodepth=128 --direct=1 --rw=randwrite --time_based --runtime=300 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-write --size=1G --filename=/dev/vdb

写性能测试用例

 #4k随机写
 $ fio --bs=4k --ioengine=libaio --iodepth=128 --direct=1 --rw=randwrite --time_based --runtime=300 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-write --size=1G --filename=/dev/vdb

#8k随机写
 $ fio --bs=8k --ioengine=libaio --iodepth=128 --direct=1 --rw=randwrite --time_based --runtime=300 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-write --size=1G --filename=/dev/vdb

#1M随机写
 $ fio --bs=1m --ioengine=libaio --iodepth=128 --direct=1 --rw=randwrite --time_based --runtime=300 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-write --size=1G --filename=/dev/vdb

吞吐测试用例

#2M顺序写
 $ fio --bs=2m --ioengine=libaio --iodepth=128 --direct=1 --rw=write --time_based --runtime=300 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-write --size=1G --filename=/dev/vdb
#2M顺序读
 $ fio --bs=2m --ioengine=libaio --iodepth=128 --direct=1 --rw=read --time_based --runtime=300 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-write --size=1G --filename=/dev/vdb

混合读写测试用例

#4k随机读写 70%写30%读

$ fio --bs=4k --ioengine=libaio --iodepth=128 --direct=1 --rw=randrw –rwmixread=70 --time_based --runtime=300 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-write --size=1G --filename=/dev/vdb

#8k随机读写 70%写30%读
$ fio --bs=8k --ioengine=libaio --iodepth=128 --direct=1 --rw=randrw –rwmixread=30 --time_based --runtime=300 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-write --size=1G --filename=/dev/vdb

时延性能测试用例

#4k随机读/写测试
 fio -bs=4k -ioengine=libaio -iodepth=1 -direct=1 -rw=randread -time_based -runtime=600 -refill_buffers -norandommap -randrepeat=0 -group_reporting -name=fio-randread-lat --size=10G -filename=/dev/vdb

#4k随机混合读写时延性能
 fio --bs=4k --ioengine=libaio --iodepth=1 --direct=1 --rw=randrw --time_based --runtime=100 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-read --size=1G --filename=/dev/vdb

输出解读详细的解释如下:

io=执行了多少M的IO
bw=平均IO带宽
iops=IOPS
runt=线程运行时间
slat=提交延迟
clat=完成延迟
lat=响应时间
bw=带宽
cpu=利用率
IO depths=io队列
IO submit=单个IO提交要提交的IO数
IO complete=Like the above submit number, but for completions instead.
IO issued=The number of read/write requests issued, and how many of them were short.
IO latencies=IO完延迟的分布
aggrb=group总带宽
minb=最小.平均带宽.
maxb=最大平均带宽.
mint=group中线程的最短运行时间.
maxt=group中线程的最长运行时间.
ios=所有group总共执行的IO数.
merge=总共发生的IO合并数.
ticks=Number of ticks we kept the disk busy.
io_queue=花费在队列上的总共时间.
util=磁盘利用率

之前我们在生产环境测试过4NvME磁盘能达到100W IOPS的案例,点这里《NVMe SSD 和硬 RAID卡 实现集中式数据库全栈国产化的100万IOPS+

Note:  不要在生产环境带业务压测,测试过文件系统后建议删除重建。

— over —

打赏

,

目前这篇文章还没有评论(Rss)

我要评论