采用SPDK技术优化虚拟机本地存储的IO性能

共 2743字,需浏览 6分钟

 ·

2021-11-15 15:05



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元)。



温馨提示:

扫描二维码关注公众号,点击阅读原文链接获取架构师技术全店资料打包汇总(全)电子书资料详情


浏览 33
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报