赛题解析 | 第四届全球数据库大赛——赛道1: 云原生共享内存数据库性能优化

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 第四届全球数据库大赛—PolarDB性能挑战赛,瓜分40万奖金池,只等你来!各赛道TOP10都可获得现金奖励

第四届全球数据库大赛—PolarDB性能挑战赛,瓜分40万奖金池,只等你来!各赛道TOP10都可获得现金奖励!

“云原生共享内存数据库性能优化”赛道,邀您提交评测啦!


大赛简介

2022年第四届全球数据库大赛—PolarDB性能挑战赛,是由阿里云、英特尔联袂主办,阿里云数据库、阿里云天池承办的数据库年度品牌赛事。自2018年以来,“阿里云数据库大赛”已经连续成功举办三届,吸引了国内外数千支队伍和个人参加,参赛者遍布11个国家和地区。


本届大赛采用双赛道机制,聚焦分布式共享内存池、基于索引的多维查询等数据库核心业务场景,参赛者在充分认知英特尔第二代傲腾持久内存(BPS)、Icelake CPU特质特性的情况下,设计最优的数据结构,探索数据库创新场景最佳实践。

了解大赛更多信息,请点击👇

image.png

其中,云原生共享内存数据库性能优化赛道,共设奖金20万元人民币


赛道直播培训

终于等到你!数据库DBer,赛道1【云原生共享内存数据库性能优化】的直播培训&答疑来啦!


7月26日明晚7点,我们邀请到阿里云数据库高级开发工程师董允,为大家带来赛道1的赛题解析,欢迎大家钉钉扫码进群观看,如有问题请在群内提问,讲师将在分享后统一作答。


  • 直播简介
    深入分析【赛道1】赛题,讲解demo代码,解释demo中RDMA框架的基本工作原理。提供解题思路,讲解如何通过设计local节点cache把demo评分从3分提升到30分。同时,解释测试过程中遇到的各种问题以及实时在线答疑。

image.png


赛题解析

本赛题需要选手实现一个双节点内存KV数据库,实现PutGet接口并且支持并发读取。


赛题场景就是该数据库有本地和远端两个服务节点,且远端的内存远大于本端节点。本地节点负责接收Put或者Get指令后选择合适的策略将数据存储在本地节点或者远端节点,远端节点负责接收本地节点发送来的数据并存储。


由于V的字节数远大于K的字节数,因此可以将V尽可能的存在远端,在本地存储K以及V在远端的位置。Sample Code中提供了一种解题思路,将K和V的存储分离,具体来说就是本地节点收到一条Put(K, V)指令后,将K存在本地内存中,通过远程通信手段(RDMA)将V传输到远端节点。下图展示了Sample Code中一条Put指令的过程,首先本地节点收到一条Put(3, "hello world ")指令后,向远端发送一条RDMA注册指令,申请在远端注册一块内存存放V, 远端节点收到该注册请求后注册内存并将该段内存的地址以及密钥返回给本地节点,本地节点将该数据作为K的元信息存储在本地,同时通过RDMA将V传输到远端节点完成存储。通过以上流程,远端节点存储了V,而本地节点保存了K以及对应的V的地址以及密钥。

image.png


解题思路

实现该KV数据库有以下几个设计难点:


  • RDMA使用与内存分配


RDMA是一种特殊的通信工具,对比TCP等通信方式,其优势在于可以使得两个节点在不通过CPU的情况下完成数据的传输,大大减小了CPU的负载,提升了传输效率。


选手在使用RDMA时需要注意,当使用节点A访问节点B的一段内存时,需要节点B先注册该段内存,并将该段内存的地址addr以及密钥rkey告知节点A,节点A将B的内存地址addr、密钥rkey信息作为元信息存在本地。这部分工作需要节点A和B的CPU共同参与完成,注册完成后,A可以直接通过RDMA访问这段内存(A节点同样需要注册的相应内存为RDMA使用),无需通过B的CPU。


其次,选手使用节点A进行RDMA访问节点B的一段内存后,返回的数据需要存储在A的一段内存中,并且这段内存也需要提前被A注册。也就是说RDMA通信本质上是两个节点上的两段提前注册好的内存之间的信息传输。因此,使用RDMA前,必须在A和B两个节点中均进行内存注册。


Sample Code中提供了RDMA注册的示例代码,使用RDMA完成节点A和节点B通信的简单流程由以下三个步骤构成:


  1. 节点A和节点B建立连接
  2. 注册节点A内存,注册节点B的内存
  3. 节点A读写节点B的内存


第一步建立连接过程Sample Code已经提供,选手可以直接使用也可以自行优化。第二部分内存注册的模版Sample Code中也已经提供,和上图保持一致,其对于内存的注册采取的策略是“即时注册”,即本地节点每次收到一条Put请求时,就发送指令给远端节点,注册一块相应大小的内存以存储该数据。然而这种注册方式存在两种问题(1)注册内存需要CPU的参与,频繁的调用注册导致程序性能下降。(2)基于该种注册方式,对于每个K,需要存储对应的V的addr和rkey等元信息,会消耗大量的内存。(这样的方式无法通过正确性测试)


因此后续选手应该优化Sample Code中的内存注册策略。提供一种参考的思路,每次注册一块较大的远端内存,在本地管理该数据在远端内存上的存储位置。这种方式减少了注册的次数,同时减少了元信息的内存消耗,但是需要选手自行管理每个数据存储在远端节点上的位置信息。对于RDMA的部分,Sample Code已经提供了完整的模版代码,选手需要在理解RDMA原理的基础上使用并完成步骤2的优化。


注意由于eRDMA内存使用特性,RDMA内存注册时建议以4096字节对齐, 如使用aligned_alloc。避免过多过小的内存注册,以避免额外元信息开销;避免超大的内存注册,避免注册失败或RDMA访问变慢。


选手的工作重心在于高效KV引擎的设计上,该部分着重考虑以下几个方面。


  • 哈希实现

Sample Code中使用了std::unordered_map存储每个K对应的V信息,选手直接提交会造成本地段OOM,因为std::unordered_map会导致巨大的内存消耗。因此,选手需要设计自己的哈希来存储K以及相应信息。


  • 数据存储位置——local cache

设计合理的数据存储方式,将K和V存储在合适的位置。Sample Code中提供的方式将V全部存储在远端节点,本地节点存储K以及对应V在远端节点的元信息。一种优化思路是将一部分V存储在本地作为local cache,该部分由选手自行设计并比较。


  • 冷热数据分离

由于测试数据存在热点分布,因此选手需要考虑将热点数据存在本地节点,将冷数据存放在远端节点。可以通过设计类似LRU的替换策略来替换冷热数据。


  • 读写策略以及并发访问

Sample Code中的Put和Get的实现原理是以一个键值对为单位进行读写,这会导致频繁的IO。选手可以参照操作系统的分页思想,以页为单位来进行数据的读写从而减少和远端IO的次数。

实现过程中需要满足多线程读取,并保证数据的正确性。该部分选手需要考虑如何分散对热点资源的访问,比如可以通过分区的方式来分散对哈希表的并发访问。同时选手应该减少通过while等消耗CPU资源的轮询方式来获取锁的机制。


报名方式

瓜分40万元奖金池,两大赛道任意选择,点击“阅读原文”马上报名参赛:

【大赛专题页】第四届全球数据库大赛—PolarDB性能挑战赛

【赛道1】云原生共享内存数据库性能优化


奖项设置

云原生共享内存数据库性能优化赛道共设奖金20万元人民币

冠军:1支队伍,每支队伍奖金6万元人民币,颁发获奖证书。

亚军:2支队伍,每支队伍奖金3万元人民币,颁发获奖证书。

季军:3支队伍,每支队伍奖金2万元人民币,颁发获奖证书。

优胜奖:4支队伍,每支队伍奖金5千元人民币,颁发获奖证书。

(上述奖项以总决赛答辩的最终名次决定)


参与奖:初赛TOP50队伍的选手将获得大赛限量版纪念T恤一件,数量按照各队伍选手人数发放。

极客奖:复赛最终排名入围TOP20所在队伍的选手将获得阿里云数据库产品事业部优先推荐招聘名额。

注:同一选手只能获得一个参赛奖,多赛道入围前10排行榜的选手,按最高排行所在赛道计入名次,其余赛道该选手所在团队名次作废,获奖资格顺延。

(例:A选手在赛道1获得第一名,与B选手组队在赛道2获得第二名,则按赛道1名次发放奖品,赛道2名次作废,获奖资格向下顺延一位。)


早鸟活动说明

  1. 即日起–7月29日,前60名报名【云原生共享内存数据库性能优化】赛道、提交有效代码并成功出分的参赛队伍,均可获赠“天池定制款笔记本一件”或“阿里云数据库定制款帆布包一个”,先到先得!


  1. 即日起–8月22日,【云原生共享内存数据库性能优化】赛道初赛排行榜成绩前40位(需成功出分),且在赛道论坛发布高分心得文章的选手,均可获赠天池/阿里云数据库限量版订制电脑包一个!


  1. 邀请小伙伴报名,亦可赢取精美礼品:
    报名期间(即日起-8月17日)成功邀请其他选手参赛即成为程序员鼓励师。鼓励师点击“报名参赛”下方“邀请参赛”生成个人专属海报,每拉新一个选手,可获得天池150粮票,粮票可在天池礼品库兑换天池纪念品。


  1. 另有早鸟礼遇,详见:https://developer.aliyun.com/adc/series/tianchi/polardb

image.png

image.png

相关文章
|
25天前
|
存储 Java 编译器
Java内存模型(JMM)深度解析####
本文深入探讨了Java内存模型(JMM)的工作原理,旨在帮助开发者理解多线程环境下并发编程的挑战与解决方案。通过剖析JVM如何管理线程间的数据可见性、原子性和有序性问题,本文将揭示synchronized关键字背后的机制,并介绍volatile关键字和final关键字在保证变量同步与不可变性方面的作用。同时,文章还将讨论现代Java并发工具类如java.util.concurrent包中的核心组件,以及它们如何简化高效并发程序的设计。无论你是初学者还是有经验的开发者,本文都将为你提供宝贵的见解,助你在Java并发编程领域更进一步。 ####
|
1月前
|
数据库 索引
深入探索数据库索引技术:回表与索引下推解析
【10月更文挑战第15天】在数据库查询优化的领域中,回表和索引下推是两个核心概念,它们对于提高查询性能至关重要。本文将详细解释这两个术语,并探讨它们在数据库操作中的作用和影响。
47 3
|
2月前
|
存储 NoSQL 关系型数据库
数据库技术深度解析:从基础到进阶
【10月更文挑战第17天】数据库技术深度解析:从基础到进阶
69 0
|
1月前
|
存储 负载均衡 监控
数据库多实例的深入解析
【10月更文挑战第24天】数据库多实例是一种重要的数据库架构方式,它为数据库的高效运行和灵活管理提供了多种优势。在实际应用中,需要根据具体的业务需求和技术环境,合理选择和配置多实例,以充分发挥其优势,提高数据库系统的性能和可靠性。随着技术的不断发展和进步,数据库多实例技术也将不断完善和创新,为数据库管理带来更多的可能性和便利。
95 57
|
5天前
|
存储 缓存 监控
如何使用内存监控工具来优化 Node.js 应用的性能
需要注意的是,不同的内存监控工具可能具有不同的功能和特点,在使用时需要根据具体工具的要求和操作指南进行正确使用和分析。
23 3
|
20天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
40 6
|
20天前
|
Android开发 开发者
Android性能优化——内存管理的艺术
Android性能优化——内存管理的艺术
|
20天前
|
监控 安全 程序员
如何使用内存池池来优化应用程序性能
如何使用内存池池来优化应用程序性能
|
20天前
|
存储 监控 Java
深入理解计算机内存管理:优化策略与实践
深入理解计算机内存管理:优化策略与实践
|
28天前
|
存储 缓存 监控