SPDK+NVMe SSD对接Virtio支撑红包场景性能

原文链接:http://mp.weixin.qq.com/s/nP62NpX0NAo4BZhpkAWaQg


本文转载自云栖社区,原文标题《红包场景下,高性能本地存储技术将硬件性能发挥到极致》。链接:https://yq.aliyun.com/articles/71655


编者注:本文介绍的高性能本地存储,应该没有针对可靠性方面的设计,因为在数据库层面有复制做为保护手段。


红包是最近兴起的全民参与的活动,2017年新春红包在参与人数和业务峰值上都到达了历史新高,其中红包除夕开奖峰值达到90W/s。在云栖社区2017红包技术峰会上,阿里云系统和块存储负责人、资深专家马涛从高性能本地存储架构设计、高性能本地存储要点分享、高性能本地存储性能数据等方面分享了阿里云在高性能本地存储方面的实战经验。


以下内容根据现场分享和幻灯片整理而成。



红包业务特点

支付宝红包的大致业务架构包括单元化部署、统一接入、网关、DAO、数据库以及在线\离线数据处理,整体流程很长。其中数据库在整理的交易链路中起到承上启下的作用。在红包业务中,数据库具有三大特点:


(1)峰值压力大。除夕夜开奖峰值达到90W/s,但这仅仅是从业务层面考虑,由于业务对数据库不仅仅是一次事务的压力,所以开奖峰值时数据库面临的压力可达百万之多。


(2)延迟要求苛刻。数据库单位时间内能承受的事务是有严格要求的,数据库延迟降低后,会大幅降低对数据库数目的需求,进而降低所需物理机配置,对整体的业务压力也会大幅度降低。


(3)自带容灾。对于大型互联网公司,他们的数据库业务实际上是有非常完善的容灾机制,数据库具备主从复制;业务层也会有本身的容灾机制。从存储来看,上层的容灾业务做得很全面。


针对红包业务,数据库的需求可以概括为两点:一是延迟要非常低,延迟要低于100us;二是IOPS一定要高,需要达到20W以上。


现有块存储产品


目前阿里提供了三种不同的块存储产品,分别是SSD云盘、高效云盘和普通云盘。三者详细的对比如上图所示,可以看到:三种块存储的产品都具有高可靠的优点,它们的数据可靠性都达到了99.9999999%;它们的缺点也非常明显,IOPS和延迟不达标,IOPS最高的SSD云盘也只有20000,延迟最低的SSD云盘也有500us之久,距离20w IOPS和100us延迟的要求还存在很大的差距,这就需要设计一款新的存储产品来满足双十一以及红包业务的要求。


因此,高性能本地存储应运而生。


高性能本地存储


高性能本地存储的设计目标是为了满足高性能数据库的要求,设计要点一是超高的IOPS;另一点是超低延迟。


通用的云本地存储常规架构如上图所示。以MySQL数据库为例,它通过POSIX API与云主机内核交互,云主机内核包括一个标准文件系统和标准的块设备接口;云主机内核下面是云物理机内核,它自上而下由标准文件系统、标准块设备接口、硬件驱动和硬件组成。当数据库发起IO访问时,要经过7个模块才能到达硬件;请求完成后,再经过7个模块才能返回给应用层,路径相当之长。云主机内核和云物理机内核中都包括标准文件系统和块设备层,也就是说同样的模块可能在云主机内跑了一遍,还需要在云物理机上再运行一遍,功能上重叠,实现方式上也基本类似;重叠的模块导致请求访问时的路径很长,对于业务和数据库性能造成的的直观影响是延迟高、性能差。


因此,采用通用的云本地存储常规架构是无法解决红包业务的需求,也不能设计出高性能的存储产品。那该如何将云本地存储的性能发挥到极致呢?我们的切入点是高性能存储架构。


上图是高性能存储架构,图中左侧是标准物理机情况下存储性能达到极致的框架:它的层次比较少,数据库经过POSIX API直接就到标准文件系统、块设备层、硬件驱动、硬件,请求所经过的模块比上文提到的云本地存储常规架构少2-3个,性能也相对有所提升。


那么如何在云主机的环境下搭建一个类似物理机的环境呢?首先云主机的必要模块是必须保留的,应该尽可能精简云物理机内核中的模块,进而达到性能的最佳值。如上图右侧所示,首先必须保留云主机内的标准文件系统和块设备层,因为它们和业务数据库是息息相关的,标准文件系统提供了标准的Open、Creat、Write之类的接口,如果省去该模块,业务是无法适配这种修改的。


对用户而言,云物理机内所有的修改都是透明的,因此在云物理机上只保留硬件驱动,从而达到最佳性能。


高性能本地存储关键组件


在云主机内,标准文件系统是不能变化的,因为它是存储与数据库、业务交互的地方。因此,想要进行性能优化,只能考虑在块设备层、硬件驱动、硬件三个模块入手加速本地存储的性能。


经过一系列的调研与研发测试,最终在块设备层使用了标准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,测试参数为--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,整体性能大幅度提升。


释放红包技术福利,即将在公有云上线


通过延迟分布和数据库性能的对比,可以看出高本地云存储对性能提升起到了很大的作用,在红包活动中发挥了很大的作用。在完成双十一及红包活动之后,阿里云希望将高性能本地云存储技术推广给其他用户使用。因此,在今年2月底,高性能本地云存储在公共云上线,它的技术架构与支撑支付宝红包的技术架构相同:采用NVMe SSD+SPDK技术,也是全球首家采用该技术的高性能本地盘。


本地盘2.0性能非常好,容量为3TB、IOPS为50万、延迟为50us、带宽为4GB。具体参数如下表所示:


可以看出,最优产品读写IOPS单盘可达24000;读带宽达2GBps;写带宽为1.2GBps。


高IO本地存储实例


有了本地盘作为基础,如果想要实现高性能本地存储实例,还需要在计算性能、存储IO性能、网络性能上进行相应地提升:


(1)为了保证计算性能稳定,采用了Intel Xeon E5-2682 v4(Broadwell)处理器,主频为2.5GHz,DDR4内存。


(2)为了保证存储IO性能稳定,采用了基于NVMe SSD和SPDK技术,提供高达数十万随机IO读写能力的同时,保持在us级别的时延水平。


(3)网络性能方面,实例网络性能与计算规格相对应(实例计算规格越大则网络性能越强)。


综上所述,将SPDK与NVMe SSD技术结合起来,能够让本地盘接近或类似物理机的性能,在双十一以及新春红包这类峰值压力很大的场景下,性能依旧很好。


关于分享者:


马涛,花名伯瑜,阿里云系统和块存储负责人、资深专家、国内知名Linux内核研发人员,10年以上操作系统以及存储研发经验,在块存储,文件系统等领域为Linux内核主线做出了卓越的贡献,在Linux内核主线有超过300个提交,同时对分布式文件系统,分布式存储等领域也有多年深入的研究。目前目前带领团队负责阿里巴巴Linux内核以及分布式块存储等相关的研发工作。



SPDK(存储性能开发套件)官方文档中文版。 第一章 简介 1 1.1.什么是SPDK? 1 1.2.入门 1 1.3. Vagrant开发环境 3 1.4.更新日志(略) 6 第二章 概念 6 2.1. 用户空间驱动程序** 6 2.2. 来自用户空间的DMA** 7 2.3. 消息传递和并发** 9 2.4. NAND Flash SSD内部 13 2.5. 将I / O提交到NVMe设备** 15 2.5.1 NVMe规范 15 2.5.2 SPDK NVMe驱动程序I / O路径 15 2.6. 使用Vhost-user进行虚拟化I / O. 16 2.6.1 介绍 16 2.6.2 QEMU 17 2.6.3 设备初始化 18 2.6.4 I / O路径 19 2.6.5 SPDK优化 20 2.7. SPDK目录结构概述 20 2.8. SPDK移植指南 22 第三章 用户指南 22 3.1. 系统配置用户指南 22 3.1.1 IOMMU配置 22 3.2. SPDK应用程序概述 23 3.2.1 配置SPDK应用程序 23 3.3. iSCSI Target 26 3.3.1. iSCSI Target入门指南 26 3.3.2. 通过配置文件配置iSCSI Target 27 3.3.3. 通过RPC方法配置iSCSI Target 28 3.3.4. 配置iSCSI启动器 29 3.3.5. rpc配置示例*** 30 3.3.6. iSCSI 热插拔 32 3.4. NVMe over Fabrics Target 32 3.5. Vhost Target(略) 37 3.6 块设备用户指南 38 3.6.1 bdev介绍 38 3.6.2 通用RPC命令 38 3.6.3 Ceph RBD 39 3.6.4 压缩虚拟Bdev模块 40 3.6.5 加密虚拟Bdev模块 41 3.6.6 延迟vbdev模块 41 3.6.7 GPT(GUID分区表) 42 3.6.8 iSCSI bdev 43 3.6.9 Linux AIO bdev 43 3.6.10 OCF虚拟bdev 43 3.6.11 Malloc bdev 44 3.6.12 NULL bdev 44 3.6.13 NVMe bdev 44 3.6.14 逻辑卷Lvol 45 3.6.15 RAID 46 3.6.16 Passthru 46 3.6.17 Pmem 46 3.6.18 Virtio Block 47 3.6.19 Virtio SCSI 47 3.7 BlobFS(Blobstore文件系统) 48 3.7.1 RocksDB集成 48 3.7.2 FUSE插件 49 3.8 JSON-RPC方法(略) 49 第四章 程序员指南 49 4.1. Blobstore程序员指南 49 4.1.1 介绍 50 4.1.2 运作理论 50 4.1.3 设计注意事项 52 4.1.4 例子 54 4.1.5配置 54 4.1.6 组件细节 54 4.2. 块设备层编程指南 56 4.3 编写自定义块设备模块 58 4.3.1 介绍 58 4.3.2 创建一个新模块 59 4.3.3创建虚拟Bdev 60 4.4 NVMe over Fabrics目标编程指南 61 4.4.1 介绍 61 4.4.2 原语结构体 61 4.4.3 基础函数 62 4.4.4访问控制 62 4.4.5发现子系统 62 4.4.6 传输 63 4.4.7选择线程模型 63 4.4.8 跨CPU核心扩展 63 4.4.9 零拷贝支持 63 4.4.10 RDMA 63 4.5 Flash传输层 64 4.5.1 术语 64 4.5.2 使用方法 67 4.6 GDB宏用户指南 69 4.6.1 介绍 69 4.6.2 加载gdb宏 71 4.6.3 使用gdb数据目录 72 4.6.4 使用.gdbinit加载宏 72 4.6.5 为什么我们需要显式调用spdk_load_macros 72 4.6.6 以上可用的宏总结 73 4.6.7 添加新宏 73 4.7 SPDK “Reduce”块压缩算法 73 4.7.1 介绍 73 4.7.2 例子 74 4.8 通知库 78 第五章 基本信息 79 5.1 事件框架 79 5.1.1 事件框架设计注意事项 80 5.1.2 SPDK事件框架组件 80 5.1.3 应用框架 80 5.2 逻辑卷 81 5.2.1 术语 81 5.2.2 配置逻辑卷 84 5.3 矢量数据包处理(略) 86 第六章 杂项 86 6.1 介绍 86 6.2 NVMe的P2P API 86 6.3 确定设备支持 87 6.4 P2P问题 87 第七章 驱动程序 88 7.1 NVMe驱动程序*** 88 7.1.1 介绍 88 7.1.2 例子 88 7.1.3 公共接口 89 7.1.4 NVMe驱动程序设计 89 7.1.5 NVMe over Fabrics主机支持 91 7.1.6 NVMe多进程 91 7.1.7 NVMe Hotplug 92 7.2 I/OAT驱动程序 93 7.2.1 公共接口 93 7.2.2 关键功能 93 7.3 Virtio驱动程序 93 7.3.1 介绍 93 7.3.2 2MB大页面 93 第八章 工具 94 8.1 SPDK CLI 94 8.1.1 安装所需的依赖项 94 8.1.2 运行SPDK应用程序实例 94 8.1.3 运行SPDK CLI 94 8.1.4 可选 - 创建Python虚拟环境 94 8.2 nvme-CLI 95 8.2.1 nvme-cli with SPDK入门指南 95 8.2.2 使用场景 95 第九章 性能测试报告(略) 96 第十章NVMe-oF Target跟踪点*** 96 10.1 介绍 96 10.2 启用跟踪点 97 10.3 捕获事件的快照 97 10.4 捕获足够的跟踪事件 98 10.5 添加新的跟踪点 99
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值