SPDK(Storage Performance Development Kit)是由Intel公司开发并开源的存储开发框架。SPDK提供了一系列工具和库以方便开发者实现高性能的,可扩展的,用户态的存储应用。SPDK已经被各大云厂商广泛地用于提升云存储的性能上,SPDK的核心思想也越来越被大家认可。
SPDK的核心思想主要为:1. SPDK采用用户态驱动访问物理存储设备,避免了访盘时频繁的用户态和内核态切换开销,且使得零拷贝成为可能。2.采用轮询机制处理物理存储设备IO完成事件,不再依赖中断机制,如此能够获得更小的IO时延。3.使用更高效的线程间消息机制,避免IO路径上的锁。在实际应用中,SPDK有两种典型应用场景:场景一,SPDK提供的vhost应用和QEMU结合以缩短虚机侧到存储后端的IO路径,该方式相对传统通过QEMU SCSI内核驱动方式接入存储后端有更小的时延。场景二:存储后端使用SPDK的用户态Nvme驱动读写物理Nvme SSD存储设备,该方式相同传统通过内核libaio接口读写物理Nvme SSD存储设备有更大的性能提升。
接下来让我们来创建一个使用SPDK Malloc Bdev块设备的虚拟机,并用fio测试其性能吧。
步骤一,下载SPDK源码并编译:git clone下载SPDK源码https://github.com/spdk/spdk.git,切换到稳定分支,比如v22.09.x,执行脚本scripts/pkgdep.sh安装编译依赖,执行./configure;make完成编译和链接,生成二进制文件./build/bin/vhost
步骤二,配置系统大页内存,并挂载大页内存文件系统:
echo 4096 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
mount -t hugetlbfs hugetlbfs /dev/hugepages
步骤三,下载qemu源码https://github.com/qemu/qemu.git,并编译生成./build/qemu-system-x86_64二进制文件
步骤四,启动SPDK vhost进程,创建SPDK Malloc bdev设备,并绑定socket
./build/bin/vhost -S /var/tmp -m 0x1 -g -s 4096
./scripts/rpc.py bdev_malloc_create -b Malloc1 10240 512
./scripts/rpc.py vhost_create_blk_controller vhost.1 Malloc1
步骤五,启动qemu进程,运行虚拟机
./build/qemu-system-x86_64 --enable-kvm -smp sockets=1,cores=2 -m 4G -hda /tmp/Fedora33.qcow2 -usb -usbdevice tablet -vnc :52 -object memory-backend-file,id=mem,size=4G,mem-path=/dev/hugepages,share=on,prealloc=yes,dump=off -numa node,memdev=mem -chardev socket,id=char0,path=/var/tmp/vhost.1 -device vhost-user-blk-pci,chardev=char0
步骤六,通过VNC登录虚拟机,使用fio测试磁盘性能
fio --group_report -name=test -ioengine=libaio -bs=4k -direct=1 -numjobjs=8 -iodepth=128 -rw=randwrite -filename=/dev/vda
通过上述实践流程,我们可以看到单个SPDK Malloc Bdev虚拟卷的性能是非常优秀的,而且这还只是单个物理核的能力。SPDK通过用户态驱动,轮询,高效的核间消息机制让存储软件能够匹配上全闪存储硬件的速度,为释放全闪存储硬件的性能提供了可靠的应用层软件参考方案。