高 IO 型本地盘存储实例:双十一中,阿里如何将数据库性能提升 100%、响应时间减少 80%?

阅读数:3658 2017 年 2 月 26 日

话题:数据库阿里巴巴语言 & 开发架构

2016 年双十一期间,阿里的交易额再次刷新历史记录,其中支付宝的支付峰值达到 12 万笔 / 秒。抛开业务数字,阿里在技术上也是做足了功课,除了使用 RocketMQ 消息中间件承受万亿级消息容量之外,还启用了上千个高 I/O 型的本地盘存储实例。

阿里云告诉 InfoQ 这一举动使得数据库的性能提升近 100%、平均响应时间节省了 80%。那么让阿里云取得如此效果背后的技术利器是什么呢?为此,InfoQ 采访了三位相关负责人。

阿里云在块存储的基础上,以半虚拟化磁盘接口 virtio-blk 研发出了高 IOPS 并发、低 IO 延迟的本地盘存储实例。

随着硬件技术的发展,硬件自身性能越来越高,存储软件的瓶颈也就越发明显。为了解决 I/O 性能上的痛点,阿里云开始基于 NVMe 协议和英特尔开源项目 SPDK 研发高 IO 存储实例。

NVMe SSD 与传统 SATA SSD 的区别

NVMe 的全称是 Non-Volatile Memory express,顾名思义是为闪存类存储介质全新设计的协议接口,最早由英特尔于 2007 年发起,当前已成为基于 PCI-E SSD 闪存所采用的主流接口协议。而 SATA SSD 所使用的 AHCI(Advance Host Controller Interface)协议,是在 80 年代后期基于 IDE/ATA 所发展起来的,面向传统机械硬盘所设计的存储接口协议。随着 SSD 本身性能的不断增强,面向机械硬盘设计的 AHCI 协议已经明显成为制约 SSD 硬盘读写性能进一步提升的最大短板,而 NVMe 协议则成为了替代 AHCI 的完美选择。相比于 AHCI,NVMe 的优势主要体现在以下方面:

  • 低延迟

    AHCI 的每个命令都需要读取 4 个不同的寄存器,而 NVMe 无需读取寄存器就可以发出命令,延迟降低至 AHCI 的 25%;

  • 多队列和更高的队列深度

    支持多队列让 CPU 的性能得到更好的释放,单核再也不是 IOPS 的瓶颈了。队列深度更是从 32 提升到惊人的 64K,能够充分压榨出 SSD 的 IOPS 性能。

SPDK:英特尔针对高性能存储应用开发的开源项目

NVMe 接口标准的固态盘通常为 SATA SSD 性能的 5-8 倍,但由于 Linux 内核驱动实现与调度机制的限制,传统的软件定义存储系统并不能完全释放其性能。为了帮助软件定义存储开发商充分发挥 NVMe 接口 SSD 的超高性能,英特尔开发了 SPDK(Storage Performance Development Kit),包含一套驱动程序,以及一整套端到端的存储参考架构。SPDK 的目标是能够把硬件平台的计算、网络、存储的最新性能进展充分发挥出来,其框架如下:

技术创新点

  1. 借助 SPDK 实现了用户态高性能存储架构,有效降低了虚拟机存储的 IO 栈深度

  2. 通过优化 NVMe 硬件中断的处理,减小因为 NVMe 硬件中断处理带来的额外 IO 延迟开销

  3. 通过优化虚拟机驱动程序,降低虚拟机访问 NVMe 硬件过程中的通信开销

研发中都攻克了哪些难关?

从项目初始立项到正式上线经历 1 年 2 个月,主要使用 C 语言来开发。研发过程中主要的障碍是使用 NVMe 以及 SPDK 等新的存储技术带来的问题:

1 新协议的使用

因为使用了 SPDK,此前通过操作系统来管理的磁盘就需要应用程序自己来进行管理,因此不仅需要开发相关的功能,对阿里云整体的运维、管控都提出了新的要求和挑战。

2 软硬件性能同时提升

具体而言,当 NVMe 设备处理单个 IO 请求的延迟降低到几十微秒(us)后,硬件设备的中断处理开销以及虚拟机中断的处理就成为了瓶颈。为了降低中断处理的开销,阿里云通过使用轮询方式来消除 NVMe 硬件中断的处理开销,在使用轮询方式后虚拟机发送 IO 请求时与物理主机通信的开销也可以进一步降低。

项目的初心与愿景

该项目起源于拜访客户时,阿里云了解到部分行业客户对于高 IOPS 并发和稳定低 IO 延迟有着较高的需求。出于提高单个服务器存储 IO 性能的初心,阿里云启动了本项目的研发。

项目的研发主要经历了两个大的版本,即集团内部数据库的使用(文中开篇提到的双十一)和本周五正式宣布的公有云对外售卖版本。据悉,目前对外售卖的版本,除采用 NVMe SSD 磁盘 +SPDK 存储性能优化架构,还使用了基于 Intel Xeon E5-2682 v4 (Broadwell) 处理器,主频为 2.5GHz,DDR4 内存以及独享型计算架构。

阿里云项目负责人强调:该高 IO 型本地盘存储实例的目标客户是具备较强开发和运维能力的企业客户,自身的系统架构可以保证业务数据的一致性,并能克服单副本数据丢失对业务造成的影响。具体应用场景主要是对存储 IO 性能要求较高,读写延时较为敏感,且业务自身具备高可用架构的场景,比如 NoSQL、OLTP、分布式日志等,适合网络游戏、互联网电商、在线直播 / 娱乐类提供在线业务的行业用户。

以下是推荐的使用场景:

(1) 用户将 Hadoop/Cassandra/MongoDB 等 NoSQL 业务部署在高 IO 型本地盘存储实例上,由于这些应用自身已经提供了数据冗余功能,本地盘单盘故障后用户的数据并不会受到影响,同时用户可以享受到更高的 IO 性能;

(2) 用户在高 IO 型本地盘存储实例上自建 MySQL 数据库,建议采用高可用架构(主库 + 从库同步复制),为了保证用户数据库数据的安全,建议用户通过 mysql_dump 等备份工具,在业务低峰期定时对 MySQL 上的数据进行备份,将数据备份到云盘上,并通过云盘快照等技术进行定期备份。

或将 MySQL 的 redolog 和 binlog 等日志文件放在本地盘中,将数据文件放在 SSD 云盘中,NVMe SSD 的低延时性能可以大幅提升 MySQL 的性能,借助 binlog 等主从同步方式保证数据安全,同时满足性能和可靠性两方面的需求;

(3) 有大量并发访问需求的用户网站可以将 memcached 部署到高 IO 型本地盘存储实例上,通过高 IO 型实例提供的高 IOPS 性能,为网站的静态数据提供更高速的缓存;

(4) 用户使用 bcache/flashcache 等工具使用高 IO 本地盘和云盘构建混合存储,通过高速本地磁盘作为缓存对云盘进行加速。

项目的下一步工作将重点集中在继续提高单实例的 IOPS 性能。

当前的高 IO 型本地盘存储实例单实例规格为 2 块 1.45TB 的高性能本地固态盘,后期将考虑提供更多的存储容量,以及更高 IOPS 并发能力,来满足更高的需求。

作者介绍

马涛,花名伯瑜,阿里云系统和块存储负责人,国内知名 Linux 内核研发人员,在内核主线有超过 300 个提交,在文件系统等存储领域为内核主线做出了卓越的贡献,目前带领团队负责阿里巴巴 Linux 内核以及块存储相关的研发工作。

刘峥,花名文卿,阿里云系统和块存储技术专家,高 IO 型本地盘存储实例底层研发负责人,专注于 Linux 内核及存储领域的研发和性能优化等工作。

彭亚雄,花名崆闻,阿里云弹性计算产品专家,高 IO 型本地盘存储实例产品负责人,专注于块存储领域的产品工作。