存储磁盘测试工具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)