欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SPDK 的测试 fio 与 pref 方法及结果

程序员文章站 2024-03-17 20:18:22
...

测试磁盘型号:Intel® SSD D5-P4420

型号官网相关性能参数:

SPDK 的测试 fio 与 pref 方法及结果

测试指标:

通常,对于一个磁盘的性能,我们主要从三方面去评估: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测试结果

顺序写:

SPDK 的测试 fio 与 pref 方法及结果

9、 相关错误及解决方案

 

 

 

 

二 、pref 测试方法

顺序写性能:4k 可以看到带宽达到994 基本接近磁盘性能上限

perf 二进制文件在编译好的spdk的/spdk/examples/nvme/perf/perf

SPDK 的测试 fio 与 pref 方法及结果

perf 脚本如下:

./perf -i 0 -q 128 -o 4096 -w write -M 50 -t 100 -r 'trtype:PCIe traddr:0000:18:00.0'

SPDK 的测试 fio 与 pref 方法及结果

 

三、fio + libaio 测试结果

 

SPDK 的测试 fio 与 pref 方法及结果

 

综上所述(以下结论来自参考文献[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

[2]https://mp.weixin.qq.com/s?__biz=MzI3NDA4ODY4MA%3D%3D&chksm=f0cb5a49c7bcd35f0f52da024484769b75be2aefc96de5f8b4ec0266c60fe8c0a8c175331c4f&idx=1&mid=2653334990&scene=21&sn=2b8cc25a6271e96ad0499fa805d34404#wechat_redirect

[3]https://www.jianshu.com/p/eeaf81ffb7b5

[4]https://github.com/spdk/spdk/issues/1505