为什么要做持久内存上的 Redis 分支 MemKey DB 呢?如今内存容量增长趋缓,较小的内存容量越来越成为需要较多内存应用的瓶颈,持久内存单根容量大、性价比高,通过持久内存来扩展内存、增加单机密度已经成为大势所趋。MemKey DB 基于内核提供的 KMEM DAX 特性来把持久内存作为易失性内存使用。
如何理解 KMEM DAX 机制,这种机制又是如何支持 MemKey DB 呢?英特尔持久内存工程师许春晔在第九期课程中,为大家详细的介绍了 Redis 在持久内存上的应用实例和 Memkey DB 的具体应用。
什么是 KMEM DAX 机制?
Redis(Remote directory server),也即远程字典服务器,是一个高性能的键值分布式内存数据库,广泛应用于游戏、视频、新闻、导航等领域。
Redis 有多种应用场景,第一种是 DDR4,也就是使用 DRAM 来缓存数据来减少延时,但 DRAM 价格昂贵,难以将内存做的很大;第二种是使用持久内存的内存模式来缓存数据,DRAM 作为持久内存的缓存,这种方式优点在于容易部署和使用,且价格便宜容量更大,缺点在于 DRAM 不可见等。第三种应用是基于 KMEM DAX 机制,将持久内存配置成较慢、较大的一个内存节点,将持久内存接入内存管理系统,应用程序可以完全透明的访问持久内存和 DRAM,将超过阈值的数据优先放入持久内存中,DRAM 中优先保存索引和键数据,这种机制的优点是容易部署且性能稳定,即使将大多数数据都存放在持久内存中,也可以达到 DRAM 性能的 80-90%,缺点在于需要 Kenel 5.1 以上版本进行支持。
基于 KMEM DAX 的 Memkey DB
通常默认的分配内存方式是,优先将数据放在 DRAM 中,DRAM 不够则将数据回落到持久内存中,因此 Redis 的初始性能就是 DRAM 性能,而当 DRAM 耗尽时,所有的数据都只能放在持久内存中,性能则会下降。而基于 KMEM DAX 的 Memkey DB 可以将持久内存配置成较慢、较大的一个内存节点,将持久内存接入内存管理系统。
MemKey DB 基于 Redis Antirez 的核心代码,依赖 Kernel 提供的 KEME DAX 特性,把持久内存作为易失性内存使用,将持久内存接入内存管理系统,从系统中可以将持久内存作为一个和 DRAM 相类似的匿名空间,将持久内存看作是一个较慢、较大的内存 Numa 节点,应用可透明访问持久内存。
采用动态阈值算法来管理数据分布,大于或等于阈值的数据都会放到持久内存中,而小于阈值的数据将会放到 DRAM 中,定期监控 DRAM 和持久内存相关的分配器统计信息来不断调整动态阈值,使数据在 DRAM 和持久内存的分布始终符合预定的比例来获得最佳性能,此外对不同的客户实例设置不同的 DRAM 和持久内存的使用比例,来对客户进行必要的分层和 QoS 的管理。
目前,Memkey DB 已经公布在阿里云的官网,虚拟机实例已完成,正在公测当中,马上就会发布,根据阿里云公布的数据,采用 MemKey DB 实现了 50%的性价比提升和 30%的成本降低,实现了巨大的性能飞跃。
许春晔为大家带来的傲腾大师课可谓干货满满,除了以上内容,想要深入了解关于 MemKey DB 的分配策略、在 Redis 主要分支上的提交,以及与 1LM ISO 的对比,并从容量和应用成本两方面给予了机制建议,都在课程视频中,快快点击观看!