【写在前面】飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适配认证四大板块,旨在共享尖端技术,为开发者提供一个涵盖多领域的开发平台和工具套件。点击这里开始你的技术升级之旅吧

image.png

本文分享至飞腾开发者平台《SPDK 的本地环境搭建和本地测试方法》

1 介绍

1.1 SPDK简介

  SPDK(Storage Performance Development Kit),顾名思义是一组用于提高存储性能的开发工具包,提供了一组用于编写高性能、可伸缩、用户态存储应用程序的工具和库。
  SPDK可以通过如下关键技术提高性能:
  1) 将所有必需的驱动程序移至用户空间,这样就避免了系统调用,并允许从应用程序中进行零拷贝访问;
  2) 轮询硬件任务的完成而不是依靠中断,这会降低总延迟和延迟抖动;
  3) 避免在I/O路径中出现锁, 而是依赖消息传递。

1.2 测试工具介绍

1.2.1 perf测试工具

  Perf是SPDK用来测试NVMe SSD 性能的工具,它的代码在spdk/example/nvme/perf路径下。Perf主要用来测试NVMe SSD的IOPS, Bandwidth和Latency,它既可以测本地的target,也可以测远端的target。

1.2.2 fio测试工具

  fio是测试存储设备的常用工具。为了能使用fio工具,SPDK推出fio_plugin机制,该机制与SPDK高度集成,可采用SPDK用户态设备驱动所提供的轮询和异步的方式进行I/O操作,I/O通过SPDK直接写入磁盘。SPDK提供两种形态的fio_plugin,基于裸盘fio_plugin,其特点为I/O通过SPDK直接访问裸盘,常用于评估SPDK用户态驱动在裸盘上的性能;基于bdev的fio_plugin,其特点为I/O测试基于SPDK块设备bdev之上,所有I/O经由块设备层bdev,再传送至裸盘设备。常用于评估SPDK块设备bdev的性能。

2 SPDK安装及测试命令汇总

2.1编译安装

  1) 获取源码

git clone https://github.com/spdk/spdk.git
cd spdk
git submodule update --init (若不成功反复执行直至成功)

  2) 安装依赖包

scripts/pkgdep/centos.sh  (如有些包未被安装,请手动安装)

  部分手动安装的包安装方式如下:

  a) help2man工具:

  方法一:从如下网站下载(注意此是centos8,其他操作系统可通过https://pkgs.org/查找)
  https://vault.centos.org/centos/8/PowerTools/aarch64/os/Packa...
  方法二:

dnf --enablerepo=PowerTools install help2man

  b) Nasm工具:

  方法一:从如下网站下载(注意此是centos8,其他操作系统可通过https://pkgs.org/查找)
  https://vault.centos.org/centos/8/PowerTools/aarch64/os/Packa...
  方法二:

dnf --enablerepo=PowerTools install nasm

  c) Ninja工具:

  首先下载re2c,网址:https://github.com/skvadrik/re2c/releases/tag/1.0.3/re2c-1.0.3.tar.gz
  然后安装re2c,如下:

./autogen.sh
./configure && make && make install

  下载ninja:

git clone https://github.com/ninja-build/ninja.git

  最后安装ninja:

./configure.py --bootstrap
cp ninja /usr/bin/

  d) libcmocka-devel工具:

  方法一:从如下网站下载(注意此是centos8,其他操作系统可通过https://pkgs.org/查找)
  https://vault.centos.org/centos/8/PowerTools/aarch64/os/Packa...
  方法二:

dnf --enablerepo=PowerTools install libcmocka-devel

  e) CUnit-devel工具

  方法一:从如下网站下载(注意此是centos8,其他操作系统可通过https://pkgs.org/查找)
  https://vault.centos.org/centos/8/PowerTools/aarch64/os/Packa...
  方法二:

dnf --enablerepo=PowerTools install CUnit-devel

  3) 安装dpdk

cd  dpdk
git checkout v19.11
./dpdk/usertools/dpdk-setup.sh  选择合适的选项进行编译

  4) 安装fio

cd ../
git clone https://github.com/axboe/fio
cd fio && git checkout fio-3.3
make
mv fio spdk

  5) 编译spdk预准备
  为保证支持fio的spdk,需做如下操作:
    a) 查看gcc版本,保证gcc版本大于4.8,暂时性升级gcc的操作如下:

yum install centos-release-scl
yum install devtoolset-7-gcc*
scl enable devtoolset-7 bash

    b) 修改dpdk的配置文件

cd dpdk/config
vim defconfig_arm64-armv8a-linuxapp-gcc
在末尾添加:EXTRA_CFLAGS=-fPIC

  6) 编译spdk

git checkout v20.07
./configure --with-fio=./fio --with-dpdk=./dpdk/arm64-armv8a-linuxapp-gcc --with-igb-uio-driver
注:如若在CONFIG文件中直接设置configure则在./configure后不需加相应参数,参考如下:
CONFIG_FIO_PLUGIN=y
CONFIG_FIO_SOURCE_DIR=/path/to/fio
CONFIG_IGB_UIO_DRIVER=y
make -j16

2.2 测试汇总

  首先测试spdk是否能使用:

./scripts/setup.sh(若要加参数可根据-h查看参数,注意该脚本的参数均得在该脚本名字前)
./examples/nvme/hello_world/hello_world

  1) perf 裸盘测试

./examples/nvme/perf/perf -q 32 -s 1024 -w randwrite -t 600 -c 0x1 -o 4096 -r 
'trtype:PCIe traddr:0000:02:00.0'

  2) fio 裸盘测试

LD_PRELOAD=./examples/nvme/fio_plugin/fio_plugin
fio/fio ./examples/nvme/fio_plugin/example_config.fio

  3) fio bdev测试

LD_PRELOAD=./examples/bdev/fio_plugin/fio_plugin
fio ./examples/bdev/fio_plugin/example_config.fio

3 具体测试及部分截图

  目前实际测试均只针对本地target和使用uio驱动。

3.1 perf测试

3.1.1 perf裸盘测试

  使用的测试命令行:

./examples/nvme/perf/perf -q 32 -s 1024 -w randwrite -t 600 -c 0x1 -o 4096 -r
'trtype:PCIe traddr:0000:02:00.0'

  参数简要介绍:q --表示使用的队列深度
  s -- 表示dpdk使用的巨页内存大小,单位是MB
  w -- 表示使用的io模式类型,必须为read, write, randread, randwrite, rw, randrw中的一种
  t -- 表示运行时间,单位s
  c -- 表示使用的core mask
  o -- 表示io大小,单位byte
  r -- 指定本地PCIe NVMe或NVMeoF的传输ID
  全部具体参数请参考perf说明。

  测试截图如图所示。

image.png

3.2 fio测试

3.2.1 fio裸盘测试

  使用的测试命令行:

LD_PRELOAD=./examples/nvme/fio_plugin/fio_plugin 
fio/fio ./examples/nvme/fio_plugin/example_config.fio

  可通过如下命令查看相关参数说明:

LD_PRELOAD=./examples/nvme/fio_plugin/fio_plugin fio/fio --enghelp=spdk

  其中通过修改example_config.fio文件对测试进行控制,文件如下:

[global]
ioengine=spdk
thread=1
group_reporting=1
direct=1
verify=0
time_based=1
ramp_time=0
runtime=10
iodepth=128
rw=randrw
bs=4k

[test]
numjobs=1
filename=trtype=PCIe traddr=0000.02.00.0 ns=1

  测试截图如图所示:

image.png

3.2.2 fio bdev测试

  使用的测试命令行:

LD_PRELOAD=./examples/bdev/fio_plugin/fio_plugin 
fio ./examples/bdev/fio_plugin/example_config.fio

  通过修改./examples/bdev/fio_plugin/bdev.conf.in对spdk测试进行配置,在裸盘之上架构一个bdev层。示例如下:

[Malloc]
  NumberOfLuns 1
  LunSizeInMB 128
[Nvme]
  TransportID "trtype:PCIe traddr:0000:02:00.0" Nvme0
  RetryCount 4
  TimeoutUsec 0
  AcctionOnTimeout None
  AdminPollRate 100000

  该示例中创造了命名为Nvme0的bdev层。
  通过修改./examples/bdev/fio_plugin/example_config.fio文件对fio进行配置。文件示例如下:

[global]
ioengine=spdk_bdev
spdk_conf=./examples/bdev/fio_plugin/bdev.conf.in
thread=1
group_reporting=1
direct=1
verify=0
time_based=1
ramp_time=0
runtime=600
iodepth=128
rw=randrw
bs=4k

[test]
numjobs=1
filename=Nvme0n1

4 所遇问题汇总

  1) 如遇到缺少libcrypto.so.10 文件,进行如下操作:

yum install compat-openssl10.aarch64 -y

  2) 编译DPDK遇到如下图所示错误

image.png

  可通过如下操作消除错误:

sudo vim /home/lso/spdk/dpdk/drivers/net/ifc/base/ifcvf.h +16 注释该行


推荐阅读

欢迎广大开发者来飞腾开发者平台获取更多前沿技术文档及资料

如开发者在使用飞腾产品有任何问题可通过在线工单联系我们



版权所有。飞腾信息技术有限公司 2023。保留所有权利。

未经本公司同意,任何单位、公司或个人不得擅自复制,翻译,摘抄本文档内容的部分或全部,不得以任何方式或途径进行传播和宣传。

商标声明

Phytium和其他飞腾商标均为飞腾信息技术有限公司的商标。

本文档提及的其他所有商标或注册商标,由各自的所有人拥有。

注意

本文档的内容视为飞腾的保密信息,您应当严格遵守保密任务;未经飞腾事先书面同意,您不得向任何第三方披露本文档内容或提供给任何第三方使用。

由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指导,飞腾在现有技术的基础上尽最大努力提供相应的介绍及操作指引,但飞腾在此明确声明对本文档内容的准确性、完整性、适用性、可靠性的等不作任何明示或暗示的保证。

本文档中所有内容,包括但不限于图片、架构设计、页面布局、文字描述,均由飞腾和/或其关联公司依法拥有其知识产权,包括但不限于商标权、专利权、著作权等。非经飞腾和/或其关联公司书面同意,任何人不得擅自使用、修改,复制上述内容。


飞腾开发者
6 声望3 粉丝

飞腾开发者技术小助手,定期分享飞腾技术文档,助力开发者打怪升级。更多材料获取:[链接]