利用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 | 性能最好 |