SPDK 的测试 fio 与 pref 方法及结果
测试磁盘型号:Intel® SSD D5-P4420
型号官网相关性能参数:
测试指标:
通常,对于一个磁盘的性能,我们主要从三方面去评估:IOPS、bandwidth、latency。
IOPS:通常评估磁盘的IOPS,主要关注块大小为4k,随机读写的情况。因此,通常fio关键参数为:bs=4k,iodepth=128,direct=1,rw=randread/randwrite。
Bandwidth:评估磁盘的bandwidth,通常是关注块大小为128k,顺序读写的情况。因此,通常fio关键参数为:bs=128k,iodepth=128,direct=1,rw=read/write。
Latency:评估latency通常情况下,是关注一个I/O发送/完成的延迟情况,因此,通常选择iodepth为1。因此,通常fio关键参数为:bs=4k,iodepth=1,direct=1,rw=randread/randwrite。此外,对于latency的结果,不仅要关注平均值,同时也要注意长尾延迟,即99.99%的延迟情况。
一、spdk + fio 测试步骤及方法
环境准备
下载dpdk、spdk、fio并解压
用最新的版本即可
1、编译fio
cd fio_dir
./configure
make&&make install
2、编译dpdk
vim <dpdk_dir>/config/defconfig_x86_64-native-linuxapp-gcc
#增加一行
EXTRA_CFLAGS=-fPIC
#回到<dpdk_dir>编译dpdk
make install T=x86_64-native-linuxapp-gcc DESTDIR=.
3、编译spdk
注意可能遇到编译错误,需要切换spdk的版本或者fio的版本
cd <spdk_dir>
./configure --with-fio=/root/Downloads/fio-fio-3.3/ --with-dpdk=/root/Downloads/dpdk-17.11/x86_64-native-linuxapp-gcc
#修改<spdk_dir>/CONFIG文件
CONFIG_FIO_PLUGIN=y
FIO_SOURCE_DIR=fio的目录
#编译spdk
make DPDK_DIR=/root/Downloads/dpdk-17.11/x86_64-native-linuxapp-gcc
3、unbind nvme driver替换为vfio
cd <spdk_dir>/scripts
sh setup.sh
4、准备hugepage
sysctl vm.nr_hugepages=40960
cat /proc/meminfo | grep Huge
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
5、使用fio执行测试
LD_PRELOAD=/spdk/examples/nvme/fio_plugin/fio_plugin /fio/fio example_config.fio
6、jobfile的例子
这个jobfile是spdk中提供的例子
[global]
ioengine=spdk
thread=1
group_reporting=1
direct=1
verify=0
time_based=1
ramp_time=0
norandommap=1
runtime=60
iodepth=32
rw=write
bs=4k
[test]
numjobs=1
filename=trtype=PCIe traddr=0000.01.00.0 ns=1
8、fio测试结果
顺序写:
9、 相关错误及解决方案
二 、pref 测试方法
顺序写性能:4k 可以看到带宽达到994 基本接近磁盘性能上限
perf 二进制文件在编译好的spdk的/spdk/examples/nvme/perf/perf
perf 脚本如下:
./perf -i 0 -q 128 -o 4096 -w write -M 50 -t 100 -r 'trtype:PCIe traddr:0000:18:00.0'
三、fio + libaio 测试结果
综上所述(以下结论来自参考文献[2])
对SPDK和内核的性能评估时,虽然性能有所提升,但是没有看到SPDK官方所展示的特别大的性能差异。
结论1:
通过fio与perf对SPDK进行性能评估,perf性能优于fio,基本perf能够将磁盘的能力耗干(99%以上)。
两种工具最大的差别在于,fio是通过与Linux fio工具进行集成,使其可以用fio_plugin引擎测试SPDK设备。而由于fio本身架构的问题,不能充分发挥SPDK的优势,整个应用框架仍然使用fio原本的架构。例如fio使用Linux的线程模型,在使用的时候,线程仍然被内核调度。而对于perf来说,是针对SPDK所设计的性能测试工具,因此在底层,不仅是I/O通过SPDK下发,同时一些底层应用框架都是为SPDK所设计的。例如刚刚所提到的线程模型,perf中是使用DPDK所提供的线程模型,通过使用CPU的亲和性将CPU核与线程捆绑,不再受内核调度,因此可以充分发挥SPDK下发I/O时的异步无锁化优势。这就是为什么perf所测得的性能要比fio高,尤其是在使用单个线程(单核)同时测试多块盘的情况下,fio所得性能要明显小于perf所得性能。因此,在同等情况下,我们更推荐用户使用perf工具对SPDK进行性能评估。
此外,在多numjob的情况下,fio与perf对iodepth的分配是不同的。通常在fio中,指定的iodepth表示所有的job一共的iodepth,而在perf指定的iodepth(perf中-q参数)通常指的是每个job所使用的iodepth。举例如下:Fio:numjob=4, iodepth=128。则每个job对应的iodepth为32(128/4)。Perf:-c 0xF (相当于fio中numjob=4),-q 128(相当于fio中iodepth=128)。则每个job对应的iodepth为128。
结论2:
首先,如结论1中所述,不同的工具之间所得出的性能结果是不同的,另外最主要的因素还是硬盘本身的性能瓶颈所导致的问题。例如,以2D NAND为介质的Intel DC P4420,本身的性能都存在一定的瓶颈,因此无论是SPDK用户态驱动还是内核驱动,都不会达到较高的IOPS。若换用更高性能的硬盘,例如使用以3D Xpoint为介质的Optane(Intel DC P4800X)为测试对象,便会看到很大的性能差异。因此,硬盘性能越高,SPDK所发挥出的优势越明显,这也是SPDK产生的初衷,其本身就是为高性能硬盘所订制的。
结论3:
关于评估不同硬盘的队列深度(iodepth)与CPU core的问题。
通常根据不同硬盘的特点,选择不同的iodepth以及所使用的CPUcore。通常在评估以2D NAND、3D NAND介质的硬盘,一般情况下,为了达到磁盘的最高性能,通常会选择较高的iodepth(128或256)。对于P4XXX的硬盘,通常可能一个CPU core无法达到满IOPS,此时并不是由于一个core的能力不够,而是由于硬盘中硬件队列本身限制的问题。因此,通常需要使用两个CPU core才能够达到specification中的满IOPS。此外,对于以3D Xpoint为介质的Optane(Intel P4800X),通常只需要一个core并使用较小的iodepth即可达到满IOPS,此时已经达到硬盘的上限,若再次增大iodepth只会是latency变大而IOPS不再增长。
下面给出各种硬盘建议的评估参数:
Intel P3700: numjob=1, iodepth=128
Intel P4500、Intel P4510、Intel P4600:numjob=2, iodepth=256
Intel Optane(Intel P4800X):numjob=1, iodepth=8/16/32
遇到问题
1、perf在测试读的时候,时间短的话,表现极差,官方给出的解释是
https://github.com/spdk/spdk/issues/297
Random write testing is very sensitive to preconditioning. For example, if you run the test with perf first, you may get a higher performance result because the SSD has not started background defrag. If the fio_plugin is used next, background defrag may start during this second test run, resulting in much lower performance.
The suggestion is to precondition the SSD with 90 minutes or random writes first. After this is completed, run a 30 minute performance test.
本人能力有限,如有不准确的地方请指出。
参考文献
[1]https://www.cnblogs.com/whl320124/articles/11358436.html
[3]https://www.jianshu.com/p/eeaf81ffb7b5
上一篇: docker搭建minio集群环境
下一篇: RSA算法详解及攻击原理分析-附攻击范例