弹性内存池(EMP):加速PolarDB的I/O性能

本文介绍了PolarStore弹性内存池(Elastic Memory Pool,简称 EMP)技术,结合高速网络和智能缓存,大幅降低数据读取延迟,提升PolarDBI/O密集型负载下的性能表现。

背景介绍

PolarDB采用计算与存储分离架构,在提供强大弹性的同时,也引入了计算节点和存储节点之间的网络延迟。当业务数据量持续增长,计算节点有限的Buffer Pool无法缓存所有热点数据时,频繁的I/O访问便成为性能瓶颈。

为解决此问题,PolarDB推出了弹性内存池(Elastic Memory Pool, EMP)技术。它在存储层(PolarStore)构建了一个基于高速RDMA网络和高性能存储介质的分布式共享内存池。通过在存储侧直接缓存热点数据,EMP能将I/O延迟降低至本地磁盘访问之下,从而显著提升数据库的吞吐量(QPS)和响应速度(RT)。EMP在以下几个典型场景中展现了显著的性能优势。

扩展内存边界,缓存海量热点数据

随着业务数据量的持续增长,计算节点有限的Buffer Pool相比于庞大的总数据量,能缓存的热点数据比例越来越低。这导致大量查询需要穿透Buffer Pool,直接从存储层的磁盘读取数据,使得I/O成为影响数据库性能的核心瓶颈。

EMP的设计初衷就是为了突破单个计算节点的内存限制。它在存储层构建了一个海量的弹性内存池,容量可远超Buffer Pool,用于缓存更大范围的热点数据。当查询未命中Buffer Pool时,可以直接从EMP的内存中高速获取数据,避免了缓慢的磁盘读取。从而有效提升数据库整体性能。

下图是开启EMP前后的I/O延迟变化,开启EMP后,延迟降低为未开启的1/3。

  • EMP关闭:image

  • EMP开启:image

应对高流量冲击,保障业务平稳

在电商秒杀、游戏大版本更新等业务高峰期,数据库会面临瞬时的高并发读写请求,流量峰值可达日常的数百倍甚至千倍。激增的流量会导致热点数据超出Buffer Pool容量,从而产生大量磁盘I/O,拖慢集群的响应。

EMP在存储层提供了一个海量缓存空间,能有效吸收I/O洪峰。根据线上游戏行业的真实案例,开启EMP后,数据库的I/O延迟降低至原来的1/5,QPS得到显著提升,并完全消除了耗时超过1秒的慢SQL,确保了业务活动期间的平稳运行。

下图为压力持续稳定高流量的情况下,开启EMPI/O延迟、QPS(每秒请求数)、TPS(每秒事务数)的变化情况。

  • 读写延迟image

  • QPS(每秒请求数)image

  • TPS(每秒事务数)image

加速数据加载,缩短服务启动窗口

当业务进行版本更新或服务重启时,数据库缓存通常会被清空。此时,应用需要从磁盘重新加载大量数据,这个预热过程会直接影响服务的启动速度。

EMP能够将核心业务数据持续缓存在其内存中。即使在数据库重启后,数据也能从EMP内存中快速加载,而非慢速的磁盘。线上某游戏客户在使用EMP后,其服务启动时间从50分钟缩短至30分钟以内,显著改善了版本更新体验。

优化大对象(BLOB)处理性能

在电商、游戏或AI搜索等业务中,经常使用BLOB类型存储图片、视频或自定义二进制数据。对这类大尺寸数据的频繁读写会给数据库带来巨大的I/O压力。

EMP通过优化底层I/O,能显著提升BLOB数据的存取性能。在模拟线上BLOB流量的测试中,开启EMP后,长度为512 KBBLOB数据查询(SELECT)性能提升了90%,更新(UPDATE)性能提升了52%。

https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/XNkOM5jw6WyQ3OY7/img/6e89a468-ae1b-4bcf-b3c4-bc6c78495d57.png

提升冷数据和批量查询效率

对于周期性报表或临时分析这类冷数据查询,数据往往不在Buffer Pool中,查询性能完全取决于磁盘I/O速度。同样,批量查询(Batch Query)通常涉及大量离散数据,导致Buffer Pool命中率极低,性能瓶颈仍在I/O。

EMP提供的TB级分层缓存架构,极大地扩展了热数据和温数据的覆盖范围。EMP多层缓存架构有效缓解了传统单层缓冲池在长尾查询场景中的性能衰减问题,为混合负载与大数据分析提供了更稳定的性能保障。

  • 冷数据查询场景:对比同一个SQL Buffer Pool全命中、 EMP关闭和开启后Buffer Pool全不命中性能对比。测试冷数据查询对比时长,性能提升55%。

    • Buffer Pool全命中:

      SELECT count(*) FROM sbtest FORCE INDEX(PRIMARY);
      +---------+
      |count(*)|
      +---------+
      |70000000|
      +---------+
      1 row in set (5.26 sec)
    • EMP关闭,Buffer Pool全不命中:

      SELECT count(*) FROM sbtest FORCE INDEX(PRIMARY);
      +---------+
      |count(*)|
      +---------+
      |70000000|
      +---------+
      1 row in set (1 min 44.07 sec)
    • EMP开启,Buffer Pool全不命中:

      SELECT count(*) FROM sbtest FORCE INDEX(PRIMARY);
      +---------+
      |count(*)|
      +---------+
      |70000000|
      +---------+
      1 row in set (47.30 sec)
  • 批量查询场景:下图为近千条SQL批量查询的对比图,横坐标为SQL时延,纵坐标为SQL延迟的百分比,能够直观的对比出使用EMP后,SQL延迟大幅下降,批量SQL总延迟减少50%。

    https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/XNkOM5jw6WyQ3OY7/img/b643f47f-01e2-4d9a-9ffe-026c4f63bb05.png