综述
互联网推动着商业社会的快速变革,对于美团等超大型互联网服务提供商而言,其数据库系统需要对仍在飞速增长的海量业务数据进行快速处理。这些核心数据库往往属于典型的性能密集型应用,内存的容量与性能在很大程度上影响着上层业务的处理效率以及可用性。此外,庞大的部署规模也使得内存的总体拥有成本 (TCO) 变得相当敏感。
为了应对亿级用户给数据库系统带来的性能压力,支撑业务创新,为用户提供高速稳定的互联网服务,美团将 Cellar 存储系统服务器中的处理器替换为第二代英特尔至强可扩展处理器,同时结合美团面向 Cellar 存储系统进行的软件优化,最终将数据库性能提升 20%,帮助美团进一步优化了数据库系统,可有效支撑未来业务的增长需求。
挑战:如何解决 Cellar 存储面临的 PAUSE 指令问题
作为中国领先的生活服务电子商务平台,美团服务涵盖餐饮、外卖、打车、共享单车、酒店旅游、电影、休闲娱乐等 200 多个品类,业务量实现了快速发展。2019年,美团年度交易用户总数达 4.5 亿,平台活跃商户总数达 620 万,用户平均交易笔数达到 27.4 笔。近年来,美团一直使用分布式 KV 存储系统 Cellar 作为最重要的在线存储服务之一,承载其海量的互联网业务。
Cellar 是一个在 Tair 基础上研发的 NoSQL 存储,在底层支持 Leverldb 、rockdb、mdb和 rdb 等引擎,各节点直接通过 raft 进行复制。Cellar 支持异地容灾、无损数据迁移,元信息存在单独节点,并且通过添加observer的形式实现路由查询能力扩展、客户与中间节点分离。目前,Cellar 已经承载了美团在线服务每天万亿级的请求量,并保持着高达 99.999% 的服务可用性。
互联网服务的典型特征是流量大,美团发现,在业务高峰期的时候,Cellar 存储系统常常会遇到异常的性能降低问题。研究之后发现,其原因在于英特尔处理器中使用的 PAUSE 指令:不同架构的英特尔至强处理器有着不同的 PAUSE 指令时长。其中,第二代英特尔至强可扩展处理器(CascadeLake 架构)的指令时长为 44 cycle,而上一代的英特尔至强可扩展处理器(Skylake 架构) PAUSE 指令时长为 144 cycle。业务应用程序设计一般基于Broadwell架构,频繁调用该指令的应用程序运行在 Skylake上时,就会出现负载相对过高的现象。
这是因为,这些程序的内部自旋,就是通过固定次数的 PAUSE 循环实现,PAUSE 指令周期增加时,执行自旋的时间也会增加,对于系统整体的吞吐量会造成影响。如果程序中使用固定次数的 PAUSE 循环来实现一段时间的延迟,以此阻塞程序执行,可能引发非预期的延迟,这突出体现在对于 Spinlock 的影响。
Spinlock又称自旋锁,是为实现保护共享资源而提出的一种锁机制。当执行spin-wait循环的时候,处理器会因为在退出循环的时候检测到内存访问顺序冲突而导致严重的性能损失,而 PAUSE 指令主要用于提示处理器目前处于spin-wait中。如上所述,这些程序的内部自旋,是通过固定次数的PAUSE 循环实现,在 PAUSE 指令时长增加之后,可能会带来执行自旋的时间延长。
此外,普通 Spinlock 在处理器多核心的情况下,同一时间只能有一个 CPU 线程获取变量并自旋,而缓存一致性协议为了保证数据的正确,会对所有 CPU 线程的状态和数据进行同步、失效等操作,导致性能下降。
除了 Spinlock 之外,PAUSE 指令还会对于内存分配带来影响。在内存分配过程中,锁会造成线程等待,对性能影响巨大。
在 Cellar 的业务实践中,美团发现,当负载较高时,与 Broadwell 架构的英特尔立处理器相比,Skylake 的英特尔处理器负载高 15% 左右。通过 vTune 分析和源码分析,原因随之浮现:Cellar 服务在高负载时会大量调用 Spinlock,PAUSE指令周期的增加导致了CPU负载的增高。
虽然通过软件优化的方式有助于解决 PAUSE 指令所带来的性能下降问题,但是如果在新部署的存储服务器中直接选择了针对此指令进行优化的新型处理器,则不仅能够降低问题影响,还有助于充分发挥新型号处理器在性能、创新功能等方面的优势。在此背景下,美团与英特尔密切合作,对于最新的硬件产品与技术进行测试、验证、部署,并充分优化存储软件,以最大化发挥硬件性能。
解决方案:基于第二代英特尔至强可扩展处理器的 Cellar 存储优化
为了在提升 Cellar 存储系统性能的同时控制 TCO 的增长,美团与英特尔展开了深度合作,将服务器中的处理器替换为二代英特尔至强金牌处理器 5218,并在性能验证中将 Cellar 存储系统的工作负载迁移到使用该处理器构建的平台上。
针对PAUSE指令对 Cellar 造成的影响,美团采用了两种方法:在软件层面,美团动态调整 Cellar 对 Spinlock 的调用次数,在应用中将循环次数降低,从而控制 PAUSE 指令执行的时长。
此外,美团还将替换 libc 的内存分配为 Jemalloc,以减少锁的使用,优化 Cellar 存储系统实际业务。JeMalloc 是一款内存分配器,与其它内存分配器相比,它最大的优势在于多线程情况下的高性能以及内存碎片的减少。为避免线程竞争锁的发生,JeMalloc 使用了线程变量,内存分配将在线程自带的内存管理器中完成,无需和其它线程进行竞争。此外,JeMalloc 中的每个线程都通过线程号的映射对应到一个数组元素中,可降低多个线程竞争一个元素的机率。由于竞争锁发生机率的降低,PAUSE 指令时长的增长对于内存管理的影响也能得到相应的控制。因此,通过将应用中的内存分配器更改为 JeMalloc,有助于缓解 PAUSE 指令周期增加所带来的吞吐量降低的问题。
在硬件层面,美团将部分存储服务器中的处理器升级为采用了 Cascade Lake架构的二代英特尔至强可扩展处理器,二代英特尔至强可扩展处理器将PAUSE 指令时长从 144 cycle 降低为 44 cycle,从而彻底消除了PAUSE指令变化带来的影响。
此外,二代英特尔至强可扩展处理器还带来了额外的性能提升。该处理器专为数据中心现代化革新而设计,能够提高各种基础设施、企业应用及技术计算应用的运行效率,进而改善总体拥有成本(TCO),提升用户生产力。它拥有更高的每核性能,能够在计算、存储和网络应用中,为计算密集型工作负载提供高性能和可扩展性。得益于英特尔超级通道互联(英特尔® UPI)、英特尔Infrastructure Management 技术(英特尔IMT)、英特尔高级矢量扩展指令集512(英特尔® AVX-512)等领先功能,它可满足严苛的 I/O 密集型工作负载的需求,能够帮助企业打造出性能更强的敏捷服务和突破性功能。
效果:Cellar 存储系统性能提升20%
为了验证在处理器更换为二代英特尔至强可扩展处理器之后,Cellar 存储系统的性能提升,美团通过测试进行了验证(测试配置如表2所示)
数据显示,与基于英特尔至强 E 系列处理器的 Cellar 存储系统相比,基于二代英特尔至强可扩展处理器的 Cellar 存储系统提升了 20% 左右。
从成本效益来看,二代英特尔至强可扩展处理器的应用通过显著的性能提升,节约了在存储节点方面的投入,总体拥有成本能够得到更好的控制,也更具面向未来工作负载的扩展性。
合作伙伴表示:“无论是卓越的硬件特性,还是在 PAUSE 指令等方面的优化,二代英特尔至强可扩展处理器都对 Cellar 存储系统性能的提升起到了至关重要的作用。通过双方的密切合作,我们不仅验证了二代英特尔至强可扩展处理器在存储系统性能优化过程中的关键作用,也为之后的进一步优化奠定了坚实基础。”
展望:美团与英特尔加速互联网基础设施创新
在发展过程中,美团正致力于去探索 Cellar 等具备突破性的存储解决方案,并实践新的运维方式,以满足业务的快速增长需求。美团计还将继续携手英特尔,充分利用软硬件技术的最新发展成果,打造高性能数据库解决方案,为内外部用户提供更高效、更可靠的服务。
除了数据库之外,美团与英特尔还在广泛的领域进行了合作,利用二代英特尔至强可扩展处理器等产品所带来的革命性技术能力,构建高性能的基础设施,在不断增长的核心互联网业务场景以及关键应用和服务中发挥越来越重要的作用,这也有助于美团为用户提供更高效、更多元化的应用体验。