在云主机内,标准文件系统是不能变化的,因为它是存储与数据库、业务交互的地方。因此,想要进行性能优化,只能考虑在块设备层、硬件驱动、硬件三个模块入手加速本地存储的性能。 经过一系列的调研与研发测试,最终在块设备层使用了标准virtio blk驱动;硬件驱动使用了SPDK工具集;硬件使用了NVMe SSD。下面对这三个模块进行详细的解读与分析。 VirTio-blk
利用Virtio blk可以实现云主机和云物理机之间的高性能数据交互。Virtio提供了半虚拟化的接口,所谓半虚拟化就是在虚拟机和物理机之间通过某种方式(修改了虚拟机某些接口),从而使得虚拟机和物理机之间实现高速传输,性能比传统的全虚拟化有所提高。 Virtio blk是标准块设备接口,通过块设备接口可以对块设备进行格式化、分区、创建文件系统等标准操作,对用户完全透明,数据库无需任何更改。Virtio blk另一个优点是采用了Virtio协议,通过共享环交换数据。在上图中,蓝色部分是虚拟机,红色部分是物理机。虚拟机通过Virtio Front End将数据通过Virtio Ring传递到后端的Virtio Back End;Virtio Back End将这些数据处理后再回传给Virtio Front End,完成了一次数据的交互。 SPDK 除了Virtio blk之外,SPDK是另一个重要的组件。SPDK全称是Storage Performance Development Kit,它是一组用来编写高性能、高扩展性的用户态存储应用的工具集。
相比于SPDK,DPDK可能更为人知,它主要是为了解决网络方面的问题。SPDK在很多模块上是与DPDK共用的,它的核心观点是通过用户态协议加无锁设计加轮询机制达到高性能: (1)用户态协议是指SPDK实现了用户NVMe协议,让用户可以在旁路内核的情况下去访问设备;其缺点是不支持posix API、不支持标准的文件系统,也没有标准的设备支持,应用性较差。 (2)无锁设计,对于高性能编程而言,无锁设计都是核心的思想,此次不再展开。 (3)轮询机制,SPDK提供了Polling Mode ,它摒弃了内核中常用的中断这类的机制,消除了中断的影响,提高了整体性能。 NVMe SSD
NVMe SSD有两个核心点:首先SSD是PCI-E的SSD,本身的访问速度是非常快的;采用NVMe之后,速度会更快,NVMe是用来代替SCSI的新协议,它具有高带宽、低延迟的特点,比SCSI协议更简单高效,提高了系统整体的性能。 数据链路
高性能本地云储存的数据链路如上图所示,在云主机中,核心数据库、POSIX API和标准文件系统保持不变。云数据库通过标准的POSIX API 访问标准文件系统;标准文件系统通过Virtio-Blk和SPDK用户态驱动直接交互,在SPDK用户态驱动中再与NVMe SSD交互,减少了数据链路的长度,同时提高了IO性能。 延迟分布
高性能本地云储存搭建之后,我们使用了fio磁盘测试工具在CentOS7上对通用虚拟化架构本地盘和阿里云高性能本地存储的随机IO平均延迟进行了对比测试。测试时块设备IO调度器均设置为noop,j2直播,测试参数为--direct=1--bs=4k--iodepth=1--numjobs=1。 从上图可以看出,在随机读两方面,阿里云高IO本地盘延迟只有70us左右,而通用虚拟化架构本地盘延迟在130us左右;随机写方面,阿里云高IO本地盘的延迟只有30us左右;通用虚拟化架构本地盘延迟在60us左右。 数据库性能对比
上图是新旧数据库Index-Update性能对比,可以看到:在旧数据库实例的情况下,TPS只有14242.65、RT为8.21ms;新数据库实例下,TPS可以达到26969.81、RT为1.7ms,整体性能大幅度提升。 释放红包技术福利,即将在公有云上线 (责任编辑:本港台直播) |