采用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网络技术,能满足高带宽和低延时的需求。


 
学习更多dpdk视频
DPDK 学习资料、教学视频和学习路线图 :https://space.bilibili.com/1600631218
Dpdk/网络协议栈/ vpp /OvS/DDos/NFV/虚拟化/高性能专家 上课地址: https://ke.qq.com/course/5066203?flowToken=1043799
DPDK开发学习资料、教学视频和学习路线图分享有需要的可以自行添加学习交流q 群909332607备注(XMG) 获取

原文链接:https://mp.weixin.qq.com/s/Sb2fynAl2rNwArwVYL4fqw

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值