在ARM架构下启动Redis时,可能会遇到“: unsupported system page size”错误。该问题通常由Redis依赖的Jemalloc内存分配库与系统页面大小不兼容引起。ARM平台默认页面大小可能为64KB,而Jemalloc默认仅支持4KB页面。
解决方法包括:一是修改Jemalloc配置,使其支持更大的页面大小;二是通过编译Redis时指定`--with-jemalloc`参数并使用适配ARM架构的Jemalloc版本;三是更换为glibc的malloc实现,禁用Jemalloc。此外,也可尝试使用官方预编译包或容器镜像,避免手动编译带来的兼容性问题。
1条回答 默认 最新
我有特别的生活方法 2025-07-12 08:10关注1. 问题现象与背景
在ARM架构下部署并启动Redis时,可能会遇到如下错误信息:
<jemalloc>: unsupported system page size此问题通常出现在使用64KB页面大小的系统中。由于Jemalloc默认设计是基于4KB页面大小进行内存管理的,因此当系统页面大小不同时,会触发兼容性问题。
1.1 ARM平台页面大小差异
- ARM64平台默认支持较大的页面大小(如64KB),以提升性能。
- x86_64平台通常使用4KB页面。
- 这种差异导致部分依赖特定页大小的库(如Jemalloc)无法正常工作。
2. 技术分析:Jemalloc与页面大小的关系
Jemalloc是一种高性能的通用内存分配器,被Redis默认采用。其内部结构高度依赖于系统的页面大小。
页面大小 是否被Jemalloc默认支持 4KB ✅ 支持 16KB ❌ 不支持(需配置) 64KB ❌ 不支持(需配置) 2.1 Jemalloc的编译配置参数
可通过修改Jemalloc源码中的配置文件或在编译时指定参数来适配不同页面大小:
make USE_JEMALLOC=yes CPPFLAGS="-DJEMALLOC_PAGESIZE=65536"3. 解决方案详解
3.1 修改Jemalloc配置以支持大页面
适用于希望继续使用Jemalloc作为内存分配器的场景。
- 下载Jemalloc源码;
- 在Makefile或编译命令中添加:
-DJEMALLOC_PAGESIZE=65536(假设页面为64KB); - 重新编译并安装Jemalloc;
- 编译Redis时指定该版本的Jemalloc路径。
3.2 使用适配ARM的Jemalloc版本
官方或社区维护的Jemalloc分支可能已对ARM平台进行了优化和适配。
git clone https://github.com/jemalloc/jemalloc.git cd jemalloc ./autogen.sh ./configure --enable-arm-page-size=65536 make && make install3.3 禁用Jemalloc,改用glibc的malloc实现
适用于快速解决问题、不追求极致性能的场景。
make USE_JEMALLOC=no3.4 使用预编译包或容器镜像
避免手动编译带来的复杂性,推荐生产环境使用。
- 使用官方提供的ARM版Redis二进制包;
- 使用Docker镜像:
redis:arm64v8; - 确保基础镜像适配目标平台。
4. 架构与流程图解析
以下是一个简化的问题解决流程图,帮助理解整体处理逻辑:
graph TD A[启动Redis失败] --> B{是否为ARM平台?} B -->|是| C[检查页面大小] B -->|否| D[其他问题排查] C --> E{页面大小是否为4KB?} E -->|是| F[使用默认Jemalloc] E -->|否| G[修改Jemalloc配置] G --> H[重新编译Redis] F --> I[Redis正常运行] H --> I本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报