今年的云原生编程挑战赛围绕“挑战 Serverless 创新实践”展开,将继续深度探索 RocketMQ、Dubbo3、Serverless 三大热门技术领域,为热爱技术的年轻人提供一个挑战世界级技术问题的舞台。希望选手们能用手中的技术,为全社会创造更大的价值。
赛道一:针对冷热读写场景的 RocketMQ 存储系统设计
瓜分60万现金大奖,三大赛道任意选择,
更有奇葩任务定义拿奖新姿势,快快点击报名吧!
https://tianchi.aliyun.com/specials/promotion/cloudnative2021
1、赛题背景
Apache RocketMQ 作为的一款分布式的消息中间件,历年双十一承载了万亿级的消息流转,为业务方提供高性能低延迟的稳定可靠的消息服务。其中,实时读取写入数据和读取历史数据都是业务常见的存储访问场景,而且会在同一时刻同时出现,因此针对这个混合读写场景进行优化,可以极大的提升存储系统的稳定性。同时英特尔® 傲腾™ 持久内存作为一款与众不同的独立存储设备,可以缩小传统内存与存储之间的差距,有望给 RocketMQ 的性能再次飞跃提供一个支点。
2、题目解析
本次赛题大致有两个关键点:分层存储如何设计、AEP在场景中扮演的角色。
首先分层存储并不是一个陌生的概念,也是一个被广泛应用技术,广义上讲,就是将数据存储在不同层级的介质中,并在不同的介质之间进行自动或者手动的数据迁移,复制等操作。事实上,分层存储的设计并没有唯一最优解的说法,需要具体场景具体设计,并尽可能考虑到极端情况。
- 4 核 8G 规格 ECS,配置 400G 的 ESSD PL1 云盘(吞吐可达到 350MiB/s ref),配置 126G 傲腾™持久内存。从机器配置上看,各个存储介质速度 8G-DRAM > 126G-AEP > 400G-ESSD。
- 正确性评测中会重启 ECS,并清空傲腾盘上的数据。重启 ECS 采用的是模拟断电的方法,因此需要保证数据至少落盘一份到 ESSD 中。
- 性能评测时,有 50% 的队列会从当前最大位点消费,剩余的从 0 开始,因此可以对“冷热数据”进行区分处理,提高系统的稳定性和运行效率。
- 虽然操作系统中有 PageCache,但是它在某种极端情况下表现得“笨笨”的,比如说混合读写中,刚写入的“热数据”可能会因为内存不足而被换出,消费时的数据又会污染本就摇摇欲坠的 PageCache,最差情况是可能导致其完全失效,全部读写都走了 SSD。
其次是如何高效利用这块 AEP。
- 英特尔® 傲腾™ 内存是一款与众不同的独立存储设备,可以缩小传统内存与存储之间的差距。
- 对于某一个设备在什么情况下使用、如何使用都是基于其特性出发的,就比如之前的机械硬盘因为物理寻址方式,顺序读写时吞吐远大于随机读写,而 DRAM 和固态硬盘则是电路寻址,不考虑硬件和软件上的缓存优化时是否顺序读写差距不大;而傲腾内存的特性又不同于其他存储介质,深入了解它将有助于更灵活更高效的使用。
https://developer.aliyun.com/article/770338?groupCode=aliyundb
3、解题思路
分层存储:
- 由于存储介质容量、速度上有较大差异,因此可以将冷热数据进行区分,新写入的数据维持在 DRAM 中,冷数据在读取前及时复制到 AEP 中。
- 由于 ESSD 的带宽非常有限,冷数据在迁移过程中会占用宝贵资源,因此可以在写入阶段采用双写。
- 由于是冷热读写的队列是随机指定的,需要程序能自己判断并区别对待。
- 可以在内存中自己维护一份缓存,减少对 PageCache 的依赖。
4、如何拿好成绩
由于成绩是取得全部流程时间总和,且各个环节互相影响,因此可以大胆发挥创造,找出最具“性价比”的优化。
例如为了优化后续读流程对数据进行规整,或者为了优化写性能在 ESSD 中只 Append 数据顺序落盘,在 AEP 或者 DRAM 中构造索引等各种方法,期待选手们都能获得自己满意的成绩!
5、傲腾技术参考文档:
- Intel傲腾持久化内存介绍:
- 傲腾持久化内存(AEP)工作模式:
https://code.aliyun.com/dts_test/dts-contest/blob/master/doc/appdirect-tips.md
- PMEM IO官网:
- 如何模拟PMEM:
- PMEM编程指北:
- PMDK示例程序:
https://github.com/pmem/pmdk-examples
- 评测环境使用PMEM:
- JAVA使用PMEMKV:
https://github.com/pmem/pmemkv-java
- Java* Support for Intel® Optane™ DC Persistent Memory:
- JAVA持久内存编程教程(视频):