容器技术通过打包运行环境和依赖到可移植的镜像中实现轻量级的资源隔离,真正做到了一次编译,随处运行,且各个实例的初始状态均一致。这种快捷部署、扩展和一致性的特性,让容器技术在近些年来广泛流行,衍生出了多种相关的技术类型并吸引了各大应用向容器环境迁移。本文将以docker容器为例,介绍SPDK与容器相结合的3个主要应用场景:(1)“在容器中实现高性能的用户态存储应用”;(2)“为容器提供高性能的外部存储”;(3)“与IPU (Infrastructure Processing Unit,业界也称DPU-- Data Processing Unit) 结合加速容器镜像的准备和容器启动过程”。
一. 在容器中实现高性能的用户态存储应用
将SPDK的应用程序在docker环境中运行的案例在SPDK的官方网站上其实已有简单的介绍[1] 。概括起来就是将SPDK应用和相应的依赖包打包到与编译环境相匹配的镜像中运行。此处将列举在Host下编译容器镜像和运行容器实例的主要步骤。在系统中安装好docker命令工具、设置好源&代理等配置参数并使用docker pull hello-world测试网络访问正常后,即可按如下步骤来执行具体的步骤。
1) 准备编译docker容器镜像的Dockerfile (内容参见如下,此处选择fedora 35作为目标镜像)
# start with the latest Fedora 35
FROM fedora:35
# if you are behind a proxy, set that up now
ADD dnf.conf ./dnf.conf
# these are the min dependencies for the hello_world app
RUN dnf install libaio-devel -y
RUN dnf install numactl-devel -y
# set our working dir
WORKDIR /app
# add the hello_world binary
ADD hello_world hello_world
# run the app
CMD ./hello_world
2) 准备docker容器文件
在目标镜像对应的OS环境编译SPDK的用户态NVMe驱动example 程序hello_world以及用于docker中使用的配置代理的文件dnf.conf(dnf.conf文件是一个通用的文件,并无特殊的地方,其内容参考系统下/etc/dnf/dnf.conf) ,与前步中的Dockerfile放在同一个目录下。
3) 编译容器镜像
进入存放上述文件的目录执行如下命令编译相应的hello镜像。
docker build ./ -t hello:1.0
编译生成image后即可使用docker images 命令进行查询,输出可举例如下所示。
REPOSITORY TAG IMAGE ID CREATED SIZE
hello 1.0 f650b0c3ffba 5 weeks ago 452MB
4) 运行容器
编译镜像完成后即可按如下操作运行相应的容器。
A. 在系统中执行SPDK源码目录下的./scripts/setup.sh将系统下看到的NVMe设备(如bus/device/fun为d9:00.0)指定给vfio_pci或者uio_pci_generic驱动。
B. 执行如下命令启动docker实例
docker run --privileged -v /dev/hugepages:/dev/hugepages -v /dev/shm:/dev/shm hello:1.0
//命令执行过程的输出可参考如下。
[2022-12-10 13:40:17.888222] [ DPDK EAL parameters: [2022-12-10 13:40:17.888253] hello_world [2022-12-10 13:40:17.888263] --no-shconf [2022-12-10 13:40:17.888275] -c 0x1 [2022-12-10 13:40:17.888284] --log-level=lib.eal:6 [2022-12-10 13:40:17.888293] --log-level=lib.cryptodev:5 [2022-12-10 13:40:17.888303] --log-level=user1:6 [2022-12-10 13:40:17.888312] --iova-mode=pa [2022-12-10 13:40:17.888320] --base-virtaddr=0x200000000000 [2022-12-10 13:40:17.888330] --match-allocations [2022-12-10 13:40:17.888339] --file-prefix=spdk_pid1 [2022-12-10 13:40:17.888359] ]
EAL: No available 1048576 kB hugepages reported
TELEMETRY: No legacy callbacks, legacy socket not created
Initializing NVMe Controllers
Attaching to 0000:d9:00.0
Attached to 0000:d9:00.0
Namespace ID: 1 size: 1600GB
Initialization complete.
INFO: using host memory buffer for IO
Hello world!
当然,也可使用docker run -itd --privileged --name=hello -v /dev/hugepages:/dev/hugepages hello:1.0 /bin/bash命令后台运行docker实例,然后通过docker exec -it hello /bash/bin登录到docker实例中手动执行