采用SPDK技术优化虚拟机本地存储的IO性能
SPDK (Storage performance development kit)是由Intel发起,用于使用NVMe SSD作为后端存储的应用软件加速库。该软件库的核心是实现了用户态、异步、无锁、轮询方式的NVMe驱动。
与传统Linux内核的NVMe驱动相比,它可以大幅度降低NVMe command的延迟,同时提高单CPU的IO处理能力IOPS,从而形成一套高性价比的解决方案,例如使用SPDK的vhost解决方案可以应用于公有云中来加速虚拟机中的NVMe I/O。
增强型DC2是滴滴云高性能解决方案中重要的组成部分,我们通过改进SPDK中的vhost框架来实现高性能IO,vhost架构如下:
SPDK vhost作为虚拟机存储的后端,以进程的形式在宿主机上运行,通过轮询的方式从共享的Ring Buffer中得到虚拟机中的IO请求,并进行处理,最后将处理完的数据同样通过Ring Buffer的方式通知虚拟机。整个过程不需要锁的保护,没有中断引入的开销,效率极高。这里面主要涉及到下面几个部分:
虚拟机中的存储前端驱动:根据具体使用的协议不同而不同,可能为virtio blk,virtio scsi,或直接使用原生的NVMe driver,主要负责接收IO请求,并将请求保存到Ring Buffer中,等待后端的处理。另一方面,前端驱动还需要处理后端的完成通知。
共享的Ring Buffer:虚拟机中的前端驱动与宿主中的存储后端共享的内存,用来在两者之间传输数据,命令和执行结果。
SPDK vhost后端:虚拟机存储的后端实现,真正处理IO请求的核心逻辑,通过用户态的存储驱动实现高效的IO操作。
传统方案下,虚拟机里面IO的处理路径如下:
可以看到,虚拟机中的IO请求需要经过非常长的调用栈才能最终得到处理,并且虚拟机和宿主机中的调用栈有很多重复的部分,这大大地增加了IO处理延时和吞吐量,最终对业务的性能造成很大的影响。通过使用SPDK+vhost解决方案,我们可以大大的缩短虚拟机中的IO处理路径,从而达到低延时,高IOPS的目的。使用SPDK+vhost方案之后,IO处理调用路径如下:
可以看到,在宿主机这端,IO请求通过SPDK用户态驱动就直接交给硬件处理,大大降低了IO处理延时和提高了IOPS。下面对该方案中各个重要模块进行介绍。
虚拟机存储前端驱动
我们可以使用virtio-blk作为虚拟机内部的存储驱动,也可以直接使用原生态的NVMe驱动。Virtio-blk可以实现虚拟机与物理机之间快速的数据传输。Virtio是一套标准的半虚拟化协议,专门为虚拟化场景进行设计和优化,能极大的提高虚拟机内部IO的处理性能。Virtio blk是在virtio协议之上实现的块设备半虚拟化接口,能够像其他接口一样,对设备进行格式化,创建文件系统等操作,另外Virtio blk在存储协议层进行了极大了优化,从而减少了协议层的开销。如果在虚拟机内部直接使用原生NVMe驱动,该驱动能直接与SPDK vhost的后端交互,避免了任何协议转换的开销,从而能达到更高的IO性能。
SPDK+vhost
SPDK的全称是Storage Performance Development Kit,它是Intel发起的一组用来编写高性能,高扩展性的用户态存储应用的工具集。官方网址:https://spdk.io/。
SPDK重用了很多DPDK中的一些公共组件,比如内存管理,轮询方式的实现等,SPDK的核心是通过无锁,轮询的方式实现高效的用户态驱动集合:
- SPDK将NVMe协议的实现放在用户态,存储应用程序直接通过SPDK提供的API访问设备,不需要Linux内核提供的驱动支持。
- SPDK一个重要的设计理念是无锁化,这样避免了多线程由于对锁的争抢而引入的性能开销。
- 轮询模式,SPDK使用轮询方式处理数据,这样避免了传统中断方式由于上下文切换而引入的性能开销。
NVMe SSD
在增强型DC2中,我们使用了Intel的高性能NVMe SSD,从协议和物理介质上也保证了快速的IO处理。NVMe协议比传统的SCSI带宽更高,延时更低,适合高性能的使用场景。
为了使SPDK技术真正产品化,在使用SPDK本地存储的情况下,我们加入了vhost热升级和QEMU热升级的支持,同时还支持vhost意外退出的自动恢复机制。这样我们可以在虚拟机完全无感知的情况下,在线热修复SPDK和QEMU的问题,升级过程中,我们会确保对虚拟机内部运行程序的影响控制在一定的范围内。
通过对SPDK+vhost整体方案的改造和产品化,我们使用fio工具对虚拟机中的IO操作进行性能测试,IO调度器设置为noop,fio进行IOPS测试的参数为:
--bs=4k
--rw=randread/randwrite
--direct=1
-numjobs=4
-iodepth=128
在随机读方面,增强型DC2本地存储的IOPS能达到73w左右,随机写能达到47w左右。
fio进行延时测试的参数为:
--ioengine=psync
--bs=4k
--rw=randread/randwrite
--direct=1
-numjobs=1
-iodepth=1
在随机读方面,强型DC2本地存储的延时为96us,随机写为23us。
滴滴云增强型DC2除了能够提供高性能的IO能力,在计算,网络等方面也提供强大的性能支持。计算方面,使用Intel最新的2.1GHz Intel(R) Xeon(R) Platinum 8160处理器,并配有全新的 Intel Advanced Vector Extension (AXV-512) 指令集,网络方面,使用先进的DPDK网络技术,能满足高带宽和低延时的需求。
转载申明:转载本号文章请注明作者和来源,本号发布文章若存在版权等问题,请留言联系处理,谢谢。
推荐阅读
更多架构相关技术知识总结请参考“架构师全店铺技术资料打包”相关电子书(37本技术资料打包汇总详情可通过“阅读原文”获取)。
全店内容持续更新,现下单“全店铺技术资料打包(全)”,后续可享全店内容更新“免费”赠阅,价格仅收198元(原总价350元)。
温馨提示:
扫描二维码关注公众号,点击阅读原文链接获取“架构师技术全店资料打包汇总(全)”电子书资料详情。