利用fio压测磁盘

io测试工具fio,可以通过多线程或进程模拟各种io操作,不但可以进行压测测试,还可以对磁盘设备进行擦写销毁。

[TOC]

安装 fio

#.安装依赖
yum -y install gcc libaio-devel

#.开始安装
cd /opt
wget -c http://iso.sqlfans.cn/linux/fio-2.2.13.tar.gz

tar -zxf fio-2.2.13.tar.gz
cd fio-2.2.13
./configure
[ $? -eq 0 ] && make -j4 && make install

#.确认版本
fio --version

利用 fio 压测磁盘设备

  • 压测基准如下,其中ssd型号为 Intel 800G * 8,raid 10,为了配合mysql而调整raid条带为16KB(默认256KB)
机器型号:HP DL360 Gen9, Intel E5-2640 v4@2.4GHz 10C*2, 128GB
磁盘设备:Intel 800G * 8,raid 10,条带16KB,挂载点 /data

fio引擎:libaio
大小:200GB
线程:64核
时长:10分钟
方案:顺序读、顺序写、顺序读写(读70%写30%)、随机读、随机写、随机读写(读70%写30%)
  • 4K 各种读写场景为例,压测脚本如下:
#.4K.测试:队列深度1
rm -rf /data/fio.iso && fio -filename=/data/fio.iso -size=200G -ioengine=libaio -direct=1 -runtime=600 -ramp_time=10 -bs=4k -iodepth 1 -thread -numjobs=64 -group_reporting -rw=read -name=linux_1d_4k_read > /tmp/linux_1d_4k_read.log
rm -rf /data/fio.iso && fio -filename=/data/fio.iso -size=200G -ioengine=libaio -direct=1 -runtime=600 -ramp_time=10 -bs=4k -iodepth 1 -thread -numjobs=64 -group_reporting -rw=write -name=linux_1d_4k_write > /tmp/linux_1d_4k_write.log
rm -rf /data/fio.iso && fio -filename=/data/fio.iso -size=200G -ioengine=libaio -direct=1 -runtime=600 -ramp_time=10 -bs=4k -iodepth 1 -thread -numjobs=64 -group_reporting -rw=rw -rwmixread=70 -name=linux_1d_4k_rw > /tmp/linux_1d_4k_rw.log
rm -rf /data/fio.iso && fio -filename=/data/fio.iso -size=200G -ioengine=libaio -direct=1 -runtime=600 -ramp_time=10 -bs=4k -iodepth 1 -thread -numjobs=64 -group_reporting -rw=randread -name=linux_1d_4k_randread > /tmp/linux_1d_4k_randread.log
rm -rf /data/fio.iso && fio -filename=/data/fio.iso -size=200G -ioengine=libaio -direct=1 -runtime=600 -ramp_time=10 -bs=4k -iodepth 1 -thread -numjobs=64 -group_reporting -rw=randwrite -name=linux_1d_4k_randwrite > /tmp/linux_1d_4k_randwrite.log
rm -rf /data/fio.iso && fio -filename=/data/fio.iso -size=200G -ioengine=libaio -direct=1 -runtime=600 -ramp_time=10 -bs=4k -iodepth 1 -thread -numjobs=64 -group_reporting -rw=randrw -rwmixread=70 -name=linux_1d_4k_randrw > /tmp/linux_1d_4k_randrw.log

#.4K.测试:队列深度64
rm -rf /data/fio.iso && fio -filename=/data/fio.iso -size=200G -ioengine=libaio -direct=1 -runtime=600 -ramp_time=10 -bs=4k -iodepth 64 -thread -numjobs=64 -group_reporting -rw=read -name=linux_64d_4k_read > /tmp/linux_64d_4k_read.log
rm -rf /data/fio.iso && fio -filename=/data/fio.iso -size=200G -ioengine=libaio -direct=1 -runtime=600 -ramp_time=10 -bs=4k -iodepth 64 -thread -numjobs=64 -group_reporting -rw=write -name=linux_64d_4k_write > /tmp/linux_64d_4k_write.log
rm -rf /data/fio.iso && fio -filename=/data/fio.iso -size=200G -ioengine=libaio -direct=1 -runtime=600 -ramp_time=10 -bs=4k -iodepth 64 -thread -numjobs=64 -group_reporting -rw=rw -rwmixread=70 -name=linux_64d_4k_rw > /tmp/linux_64d_4k_rw.log
rm -rf /data/fio.iso && fio -filename=/data/fio.iso -size=200G -ioengine=libaio -direct=1 -runtime=600 -ramp_time=10 -bs=4k -iodepth 64 -thread -numjobs=64 -group_reporting -rw=randread -name=linux_64d_4k_randread > /tmp/linux_64d_4k_randread.log
rm -rf /data/fio.iso && fio -filename=/data/fio.iso -size=200G -ioengine=libaio -direct=1 -runtime=600 -ramp_time=10 -bs=4k -iodepth 64 -thread -numjobs=64 -group_reporting -rw=randwrite -name=linux_64d_4k_randwrite > /tmp/linux_64d_4k_randwrite.log
rm -rf /data/fio.iso && fio -filename=/data/fio.iso -size=200G -ioengine=libaio -direct=1 -runtime=600 -ramp_time=10 -bs=4k -iodepth 64 -thread -numjobs=64 -group_reporting -rw=randrw -rwmixread=70 -name=linux_64d_4k_randrw > /tmp/linux_64d_4k_randrw.log
  • 16K 各种读写场景为例,压测脚本如下:
#.16K.测试:队列深度1
rm -rf /data/fio.iso && fio -filename=/data/fio.iso -size=200G -ioengine=libaio -direct=1 -runtime=600 -ramp_time=10 -bs=16k -iodepth 1 -thread -numjobs=64 -group_reporting -rw=read -name=linux_1d_16k_read > /tmp/linux_1d_16k_read.log
rm -rf /data/fio.iso && fio -filename=/data/fio.iso -size=200G -ioengine=libaio -direct=1 -runtime=600 -ramp_time=10 -bs=16k -iodepth 1 -thread -numjobs=64 -group_reporting -rw=write -name=linux_1d_16k_write > /tmp/linux_1d_16k_write.log
rm -rf /data/fio.iso && fio -filename=/data/fio.iso -size=200G -ioengine=libaio -direct=1 -runtime=600 -ramp_time=10 -bs=16k -iodepth 1 -thread -numjobs=64 -group_reporting -rw=rw -rwmixread=70 -name=linux_1d_16k_rw > /tmp/linux_1d_16k_rw.log
rm -rf /data/fio.iso && fio -filename=/data/fio.iso -size=200G -ioengine=libaio -direct=1 -runtime=600 -ramp_time=10 -bs=16k -iodepth 1 -thread -numjobs=64 -group_reporting -rw=randread -name=linux_1d_16k_randread > /tmp/linux_1d_16k_randread.log
rm -rf /data/fio.iso && fio -filename=/data/fio.iso -size=200G -ioengine=libaio -direct=1 -runtime=600 -ramp_time=10 -bs=16k -iodepth 1 -thread -numjobs=64 -group_reporting -rw=randwrite -name=linux_1d_16k_randwrite > /tmp/linux_1d_16k_randwrite.log
rm -rf /data/fio.iso && fio -filename=/data/fio.iso -size=200G -ioengine=libaio -direct=1 -runtime=600 -ramp_time=10 -bs=16k -iodepth 1 -thread -numjobs=64 -group_reporting -rw=randrw -rwmixread=70 -name=linux_1d_16k_randrw > /tmp/linux_1d_16k_randrw.log

#.16K.测试:队列深度64
rm -rf /data/fio.iso && fio -filename=/data/fio.iso -size=200G -ioengine=libaio -direct=1 -runtime=600 -ramp_time=10 -bs=16k -iodepth 64 -thread -numjobs=64 -group_reporting -rw=read -name=linux_64d_16k_read > /tmp/linux_64d_16k_read.log
rm -rf /data/fio.iso && fio -filename=/data/fio.iso -size=200G -ioengine=libaio -direct=1 -runtime=600 -ramp_time=10 -bs=16k -iodepth 64 -thread -numjobs=64 -group_reporting -rw=write -name=linux_64d_16k_write > /tmp/linux_64d_16k_write.log
rm -rf /data/fio.iso && fio -filename=/data/fio.iso -size=200G -ioengine=libaio -direct=1 -runtime=600 -ramp_time=10 -bs=16k -iodepth 64 -thread -numjobs=64 -group_reporting -rw=rw -rwmixread=70 -name=linux_64d_16k_rw > /tmp/linux_64d_16k_rw.log
rm -rf /data/fio.iso && fio -filename=/data/fio.iso -size=200G -ioengine=libaio -direct=1 -runtime=600 -ramp_time=10 -bs=16k -iodepth 64 -thread -numjobs=64 -group_reporting -rw=randread -name=linux_64d_16k_randread > /tmp/linux_64d_16k_randread.log
rm -rf /data/fio.iso && fio -filename=/data/fio.iso -size=200G -ioengine=libaio -direct=1 -runtime=600 -ramp_time=10 -bs=16k -iodepth 64 -thread -numjobs=64 -group_reporting -rw=randwrite -name=linux_64d_16k_randwrite > /tmp/linux_64d_16k_randwrite.log
rm -rf /data/fio.iso && fio -filename=/data/fio.iso -size=200G -ioengine=libaio -direct=1 -runtime=600 -ramp_time=10 -bs=16k -iodepth 64 -thread -numjobs=64 -group_reporting -rw=randrw -rwmixread=70 -name=linux_64d_16k_randrw > /tmp/linux_64d_16k_randrw.log

利用 fio 销毁ssd设备

  • 宝存设备的格式化与销毁
#.1.利用shannon工具,先将ssd设备分离、再进行擦除格式化,然后再加载上去
shannon-detach /dev/scta
shannon-format --erase /dev/scta
shannon-attach /dev/scta

#.2.以windows为例,先把ssd设备挂载的f盘格式化,再利用fio对全盘进行2遍的数据填充
cd /d d:\tools\fio
fio --ioengine=windowsaio --direct=1 --thread --norandommap --filename=f:\fio.dat --size=100G --name=seq_write --rw=write --bs=128k --numjobs=1 --iodepth=128 --loops=2 --output=seq_write.log
fio --ioengine=windowsaio --direct=1 --thread --norandommap --filename=f:\fio.dat --size=100G --name=seq_write --rw=write --bs=128k --numjobs=1 --iodepth=128 --loops=2 --output=seq_write.log
  • Membalze设备的格式化与销毁
#.1.利用Membalze工具对全盘数据进行清除
nvme format /dev/nvme0n1

#.2.利用fio对全盘进行2遍的数据填充
fio --ioengine=libaio --direct=1 --thread --norandommap --filename=/dev/nvme0n1 --name=seq_write --rw=write --bs=128k --numjobs=1 --iodepth=128 --loops=2 --output=seq_write.log
fio --ioengine=libaio --direct=1 --thread --norandommap --filename=/dev/nvme0n1 --name=seq_write --rw=write --bs=128k --numjobs=1 --iodepth=128 --loops=2 --output=seq_write.log
  • 利用cipher工具对ssd设备进行格式化与销毁
#.方案:先把D盘格式化,以管理员身份运行cmd,并运行如下命令(注意最后的字母“D”代表分区盘符):
#.原理:先用0x00覆盖剩余空间,再用0xFF覆盖剩余空间,最后再使用随机数字进行擦写;
#.注意1:先CD到D:盘,否则会擦写当前的C:盘;
#.注意2:该命令不会删除正常文件,只擦除x盘剩余空间,这样就可以做到删除的文件无法恢复了

cd /d d:
cipher /w:D

附录

fio 参数详解

filename=/dev/sdb1          //压力测试的文件名
ioengine=libaio             //指定io引擎,包括libaio、pync等方式
direct=1                    //设置非缓冲io,测试过程绕过机器自带的buffer,使测试结果更真实。
iodepth=16                  //队列深度
rw=read                     //测试顺序读的I/O
  rw=write                  //测试顺序写的I/O
  rw=randread               //测试随机读的I/O
  rw=randwrite              //测试随机写的I/O
  rw=rw                     //顺序混合读写I/O,默认读写比例5:5
  rw=randrw                 //测试混合随机读写的I/O,默认读写比例5:5
bs=16k                      //单次io的块文件大小为16k,块大小必须是扇区的倍数
  bsrange=512-2048          //同上,提定数据块的大小范围
lockmem=1g                  //只使用1g内存进行测试
size=5G                     //本次测试总共的io大小为5G,以每次4k的io进行测试。
nrfiles=8                   //每个进程生成文件的数量。
numjobs=30                  //本次的测试线程为30,也就是并发数,默认是1
runtime=1000                //测试时间为1000秒,不指定此参数则持续写到指定size大小为止。
rwmixwrite=30               //在混合读写的模式下,写占30%
rwmixread=70                //在混合读写的模式下,读占70% 
group_reporting             //如果设置了多任务参数numjobs,用每组报告代替每job报告
userspace_reap           
zero_buffers                //用0初始化系统buffer。
randrepeat=0                //设置产生的随机数是不可重复的
ramp_time=6                 //设定在记录任何性能信息之前要运行特定负载的时间。等性能稳定后,再记录日志结果,可以减少日志对高速IO的影响。

其他参数说明
time_based                  //在runtime压力测试周期内,如果规定数据量测试完,要重复测试 
norandommap  
iodepth_batch=8  
iodepth_low=8  
iodepth_batch_complete=8  
exitall                     //一个job完成,就停止所有的
refill_buffers              //每次提交后都重复填充io buffer
overwrite=1                 //设置文件可覆盖
sync=1                      //设置异步io
fsync=1                     //一个io就同步数据
invalidate=1                //开始io之前就失效buffer-cache
directory=/your_dir         // fielname参数值的前缀
thinktime=600               //在发布io前等待600秒
thinktime_spin=200          //消费cpu的时间,thinktime的剩余时间sleep
thinktime_blocks=2          //在thinktime之前发布的block数量
bssplit=4k/30:8k/40:16k/30  //随机读4k文件占30%、8k占40%、16k占30%

ssd 设备压测对比

本人曾经对各种ssd设备进行过压测测试,对比数据如下,所有压测基于同一款服务器配置(HP DL360 Gen9, Intel E5-2640 v4@2.4GHz 10C*2, 128GB),由于运行的是 SQL Server,所以重点关注 64K 的随机读写性能。

  • sqlio压测结果(sqlserver主要关注64K随机读写)
设备型号 64K顺序读 64K顺序写 64K随机读 64K随机写 备注
Intel 800G*8 51000 IOPS、3200 MB/s 30000 IOPS、1900 MB/s 42000 IOPS、2600 MB/s 27000 IOPS、1700 MB/s 8块盘做RAID 10
宝存 3.2TB 40000 IOPS、2500 MB/s 19000 IOPS、1187 MB/s 43000 IOPS、2700 MB/s 19600 IOPS、1220 MB/s 性能不如第1个
Memblaze 3.2TB 54017 IOPS、3376 MB/s 53769 IOPS、3360 MB/s 54014 IOPS、3375 MB/s 53751 IOPS、3359 MB/s 性能比第1个好
Memblaze 3.6TB 96075 IOPS、6004 MB/s 64188 IOPS、4018 MB/s 96077 IOPS、6004 MB/s 64416 IOPS、4026 MB/s ssd容量越大,性能越好
  • diskspd压测结果(sqlserver主要关注64K随机读写)
设备型号 4K Total IO 8K Total IO 16K Total IO 32K Total IO 64K Total IO 备注
Intel 800G*8 468 MB/s、119925 IOPS 881 MB/s、112790 IOPS 1140 MB/s、 73022 IOPS 1399 MB/s、 44789 IOPS 1710 MB/s、27041 IOPS 8块盘做RAID 10
宝存 3.2TB 241 MB/s、 61909 IOPS 522 MB/s、 66856 IOPS 640 MB/s、 40993 IOPS 1793 MB/s、 57404 IOPS 2027 MB/s、32438 IOPS 性能不错
Memblaze 3.2TB 637 MB/s、163310 IOPS 1349 MB/s、172782 IOPS 3786 MB/s、242333 IOPS 3971 MB/s、127072 IOPS 4110 MB/s、65773 IOPS 性能不错
Memblaze 3.6TB 576 MB/s、147551 IOPS 1697 MB/s、217325 IOPS 5584 MB/s、357390 IOPS 6323 MB/s、202353 IOPS 6635 MB/s、106161 IOPS 性能最好
Copyright © www.sqlfans.cn 2024 All Right Reserved更新时间: 2024-12-17 19:49:45

results matching ""

    No results matching ""