【写在前面】飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适配认证四大板块,旨在共享尖端技术,为开发者提供一个涵盖多领域的开发平台和工具套件。点击这里开始你的技术升级之旅吧
本文分享至飞腾开发者平台《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说明。
测试截图如图所示。
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
测试截图如图所示:
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遇到如下图所示错误
可通过如下操作消除错误:
sudo vim /home/lso/spdk/dpdk/drivers/net/ifc/base/ifcvf.h +16 注释该行
推荐阅读
欢迎广大开发者来飞腾开发者平台获取更多前沿技术文档及资料
如开发者在使用飞腾产品有任何问题可通过在线工单联系我们
版权所有。飞腾信息技术有限公司 2023。保留所有权利。
未经本公司同意,任何单位、公司或个人不得擅自复制,翻译,摘抄本文档内容的部分或全部,不得以任何方式或途径进行传播和宣传。
商标声明
Phytium和其他飞腾商标均为飞腾信息技术有限公司的商标。
本文档提及的其他所有商标或注册商标,由各自的所有人拥有。
注意
本文档的内容视为飞腾的保密信息,您应当严格遵守保密任务;未经飞腾事先书面同意,您不得向任何第三方披露本文档内容或提供给任何第三方使用。
由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指导,飞腾在现有技术的基础上尽最大努力提供相应的介绍及操作指引,但飞腾在此明确声明对本文档内容的准确性、完整性、适用性、可靠性的等不作任何明示或暗示的保证。
本文档中所有内容,包括但不限于图片、架构设计、页面布局、文字描述,均由飞腾和/或其关联公司依法拥有其知识产权,包括但不限于商标权、专利权、著作权等。非经飞腾和/或其关联公司书面同意,任何人不得擅自使用、修改,复制上述内容。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。