当前位置:首页 > 问答 > 正文

Redis在ARM上跑得快不快?聊聊那些优化和适配的小技巧

关于Redis在ARM架构上跑得到底快不快,这个问题其实没有一个简单的“快”或“慢”的答案,它更像是一个“有条件的好学生”。在同等工艺和核心数量的情况下,现代的高性能ARM服务器CPU(比如AWS Graviton、Ampere Altra等)运行Redis,其性能完全可以媲美甚至在某些场景下超越同代的x86服务器CPU。

但这并不是说直接把为x86编译的Redis放到任何一台ARM设备上都能飞起来,这里面有很多门道,需要一些优化和适配的小技巧,才能让Redis在ARM平台上发挥出真正的实力。

我们得聊聊为什么ARM能行。

早期的ARM处理器主要面向移动设备和嵌入式系统,强调的是低功耗,性能上确实无法与同时代的x86服务器芯片抗衡,但时过境迁,ARM阵营出现了像ARM Neoverse这样的高性能核心设计,专为数据中心打造,这些核心具有更宽的流水线、更大的缓存和更高的主频,为运行Redis这类内存密集型应用打下了坚实的基础,根据云服务商AWS的官方博客(来源:AWS Blog)和一些第三方评测,在AWS上使用Graviton2或Graviton3处理器实例运行Redis,相比同级别的x86实例,不仅性能有显著提升,成本还能降低高达20%左右,这主要得益于ARM架构天生的高能效比,以及芯片设计上可以集成更多的核心。

Redis在ARM上跑得快不快?聊聊那些优化和适配的小技巧

要让Redis在ARM上“跑得快”,需要注意哪些小技巧呢?

第一,也是最关键的一点:使用正确的编译器和编译选项。

千万不要直接使用从x86平台移植过来的二进制包,Redis的源代码需要在你自己的ARM服务器上重新编译,为什么呢?因为不同的CPU支持的指令集优化是不同的,使用GCC或Clang这类现代编译器,并开启针对ARM架构的优化 flags 至关重要。

Redis在ARM上跑得快不快?聊聊那些优化和适配的小技巧

  • -march 和 -mcpu:这两个参数是核心,如果你的服务器是AWS Graviton2(基于ARM Neoverse N1核心),你应该在编译时指定 -march=armv8.2-a -mcpu=neoverse-n1,这能告诉编译器:“请生成最适合我这个CPU型号的机器码”,从而充分利用CPU的特殊指令和微架构特性,大幅提升性能,如果只是用通用的 -O2-O3,效果会打折扣。
  • 避免有问题的优化:有用户报告(来源:GitHub上的Redis issue讨论),在某些旧版本的编译器或特定优化级别下,ARM版本可能会遇到一些极端情况下的崩溃问题,使用较新的编译器版本并采用经过验证的稳定优化组合可以避免。

第二,关注内存子系统。

Redis是内存数据库,对内存带宽和延迟极其敏感,幸运的是,现代服务器级ARM CPU通常都配置了多通道DDR4或DDR5内存控制器,能提供充沛的内存带宽,这里的“小技巧”更多是硬件选型层面的:

  • 确保你的ARM服务器配置了足够通道和频率的高性能内存条。
  • 在云服务上选择ARM实例时,留意其规格说明中的内存带宽数据。

第三,注意一些细微的代码差异。

Redis在ARM上跑得快不快?聊聊那些优化和适配的小技巧

虽然Redis社区对ARM架构的支持已经很好,但历史上确实存在过一些因底层库或特定代码路径导致的问题。

  • Jemalloc内存分配器:Redis默认使用Jemalloc来管理内存,以获得更好的碎片控制,确保你编译时使用的Jemalloc版本也对ARM有良好的优化。
  • 原子操作和内存序:不同架构对内存访问顺序的模型略有差异,Redis作为高性能数据库,大量使用了原子操作来保证并发安全,好在Redis核心开发团队已经处理了绝大部分这类跨平台问题,但使用最新的稳定版Redis总是更稳妥的选择。

第四,利用ARM架构的特性。

ARM架构有一些独特的优势可以利用,ARMv8-A指令集引入了可选的CRC(循环冗余校验)指令,这些指令在计算校验和时非常高效,如果Redis在处理网络数据或进行持久化时用到校验和,启用这些硬件指令能带来一点额外的性能提升,这需要代码和编译器的共同支持。

Redis在ARM上不仅能跑,而且能跑得飞快,尤其是在为云原生和能效优化的新一代ARM服务器上,实现这一目标的关键在于“量身定制”:一定要在目标ARM硬件上,使用最新的工具链(编译器),带上正确的CPU架构优化参数进行本地编译。 保持Redis和系统底层库的更新,以获取最新的优化和问题修复。

如果你正准备在ARM服务器上部署Redis,完全不必担心性能问题,只要你花几分钟时间做好编译优化这个关键步骤,这个“好学生”一定会用出色的性能回报你。