资讯动态

ARM 架构 Linux 下源码编译安装 Redis 7 的完整实战指南

发布时间:2026/9/29 7:31:59 来源:尧图企业网站定制
去年年底我从运维同事手里接过一台 ARM 架构的 Linux 云主机系统是 Ubuntu 22.04CPU 显示 aarch64。我当时的任务是尽快在上面把 Redis 跑起来给业务做缓存。本来以为就是一条apt install redis-server的事结果发现网上关于 Linux-ARM 平台安装 Redis 的内容不多而且很多是按照 x86_64 的思路写的照着敲命令很容易在编译阶段就被报错卡住。这篇文章就把我在 ARM 设备上的完整安装过程写清楚包括平台识别、工具链准备、apt 与源码编译两条路线的取舍、编译参数、systemd 托管、基准性能摸底以及我踩过的几个坑。手里有树莓派、RK3568 这类开发板或者 ARM 云主机想在 arm64/armhf Linux 上把 Redis 跑起来的朋友可以直接照着操作。1. 为什么在ARM上装Redis不能直接照搬x86教程很多人在 ARM 上装 Redis 翻车第一反应是找编译报错但真正的根因往往在第一步就没想清楚你手里的 ARM到底是哪一种 ARM。1.1 先分清 aarch64 与 armv7l两者完全是两回事ARM 平台的碎片化比 x86 体系严重得多。x86_64 基本就一套指令集大家的行为一致ARM 这边光常见的就有 aarch64也就是 arm6464位、armv7l一般是 32 位、armhf 这种软浮点/硬浮点的区分。拿uname -m一看便知$ uname -m aarch64如果输出的是aarch64那就是纯 64 位环境Ubuntu/Debian 的软件源通常叫arm64。如果输出的是armv7l那就是 32 位环境软件源通常是armhf。这两个环境的软件包、编译选项、内存管理方式都有区别网上很多教程默认只有其中一种照抄出错很正常。1.2 直接 apt install 在部分 ARM 环境并不好使在 x86 的 Ubuntu 上sudo apt install redis-server确实能一条命令装完。但我在 ARM 云主机上遇到过两种情况一是某些精简版镜像的软件源里根本没有 redis-server 包要换源才能找到二是即便有版本往往偏旧而且软件源里带的二进制包未必针对你的芯片微架构做过优化。对生产环境来说我更倾向源码编译因为 Redis 官方源码对 ARM 的支持本身就很成熟编译可控、版本可控、安装路径可控后面维护起来心里有底。1.3 源码编译才是 ARM 上最通用的路线Redis 官方下载页提供的源码包对交叉编译和本机编译都做了支持。Makefile 会根据当前系统自动探测架构和依赖。相比 x86 平台在 ARM 上采用源码编译有两点优势第一可以自己指定编译参数比如用MALLOClibc绕开 jemalloc 的坑第二可以指定安装目录避免污染系统目录卸载时直接删目录即可对不太想把系统环境搞乱的朋友很友好。2. 环境准备先把平台底细摸清楚再动手编译 Redis 之前我建议先花两分钟把系统底细确认清楚不然中途报错你会很难判断是依赖问题还是架构问题。2.1 用三条命令识别平台与系统# 查看 CPU 架构 uname -m # 查看发行版信息 cat /etc/os-release # 查看 CPU 特性、核心数、内存 lscpu | head -20如果uname -m输出aarch64后面编译参数不需要额外指定Redis 的 Makefile 能自动识别。如果是 32 位 armv7l那么内存一般也不会太大编译时建议少开并行任务不然容易 OOM。2.2 安装编译工具链与依赖不同发行版安装命令有所不同这里列一下我常用的# Debian / Ubuntu sudo apt update sudo apt install -y build-essential pkg-config libsystemd-dev # CentOS / OpenEuler (dnf 系) sudo dnf install -y gcc make pkg-config systemd-devel这里有两个容易忽略的点。一个是pkg-config很多编译脚本要用它找依赖库另一个是libsystemd-dev或systemd-devel如果你想让 Redis 以 systemd 服务的形态运行编译时就需要这个开发库。2.3 Redis 版本与编译工具的匹配我这次选的是 Redis 7.2 的 stable 版本它对 ARM64 的支持已经很成熟。如果你用的是树莓派这类硬件比较老的 32 位环境建议先确认 gcc 版本不低于 8否则个别特性会编译失败。可以用gcc --version看一下。3. apt拉包与源码编译两条路线我为什么推荐后者很多新手最纠结的就是既然 apt 能装为什么还要编译我实际体验下来两条路线各有适用场景但生产环境我更推荐源码编译。3.1 apt 安装的适用场景如果你只是想在本机快速验证 Redis 的命令、数据类型或者写学习 Demoapt 安装确实省事sudo apt update sudo apt install -y redis-server systemctl start redis-server redis-cli ping这一套下来 Redis 已经能跑了。优点很明显不用管编译依赖不用写 service 文件。缺点是版本跟着源走源里是什么版本就是什么版本。3.2 源码编译与 apt 安装的对比我整理了一张表方便直观对比对比项apt 安装源码编译安装速度快一条命令慢看设备和 CPU 核心数版本可控性受软件源限制完全可控官方 stable 任选编译参数不可控可指定 MALLOC、BUILD_TLS 等卸载方便度需要 apt remove直接删安装目录即可对 ARM 的适配依赖源里是否打包官方 Makefile 原生支持二进制兼容源里的通用包基于本机微架构编译3.3 我为什么最终选源码编译当时业务方要求 Redis 版本不低于 7.0因为后面要用到 Redis Function 和较新的数据结构而 apt 源里的版本只有 6.0这就没得选了。源码编译虽然前后花了十几分钟但装完就是最新 stable后面跑 Redis Stack 的模块、做缓存治理都用得上这个底子。如果你也是在 ARM 设备上做项目开发而不是纯尝鲜建议一步到位走源码编译。4. 源码编译全流程下载、解压、make、install 的完整实操这一节是全文的核心操作部分我在 ARM 设备上完整跑通的流程直接照着复制就行。4.1 下载官方源码包并校验我习惯把源码放到/opt/src下方便统一管理sudo mkdir -p /opt/src cd /opt/src sudo curl -O https://download.redis.io/redis-stable.tar.gz sudo sha256sum redis-stable.tar.gz下载完成后去 Redis 官网核对 sha256 的值这一步虽然麻烦但能避免源码包被篡改。我在内网环境遇到过下载源被劫持的情况校验一下比较踏实。4.2 解压并处理 MALLOC 报错sudo tar xzf redis-stable.tar.gz cd redis-stable sudo make -j4在 ARM 设备上这里有一个高频报错。由于部分 ARM Linux 系统没有预装 jemalloc 的开发库编译过程中会提示类似MALLOCjemalloc初始化失败或者直接报错murmur相关符号找不到。解决办法是把内存分配器切回 libcsudo make MALLOClibc -j4刚开始我以为是源码问题后来翻了官方文档才知道Redis 默认在 Linux 上使用 jemalloc是为了减少内存碎片。但如果你没有安装 jemalloc-dev编译就会卡住。用MALLOClibc不会影响 Redis 的稳定性只是在高并发高碎片场景下内存占用率会比 jemalloc 高一些。生产环境如果在意内存碎片可以提前装好依赖sudo apt install -y libjemalloc-dev然后正常 make。4.3 指定安装目录并执行 install我不建议把 Redis 可执行文件直接装到/usr/local/bin虽然这是默认路径但后续要升级、卸载时容易和其他软件混在一起。我通常会指定一个独立目录sudo make PREFIX/usr/local/redis install安装完成后可执行文件会出现在/usr/local/redis/bin下$ ls /usr/local/redis/bin/ redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server注意这里PREFIX只影响安装路径不影响编译过程。redis-server、redis-cli、redis-benchmark这些常用二进制都在。4.4 系统内存较小时的编译技巧如果是树莓派或者小内存开发板编译 Redis 时内存占用可能冲到几百 MB稍不注意就 OOM。我的做法是sudo make MALLOClibc -j1-j1表示单任务编译虽然慢一点但能显著降低内存峰值。还有一个技巧编译前用make distclean清掉上次残留的目标文件避免旧配置干扰。我踩过一次树莓派 3B 上没清理直接 make结果莫名报错清理后就好了。4.5 验证安装是否成功$ /usr/local/redis/bin/redis-server --version Redis server v7.2.4 sha00000000:0 malloclibc bits64 buildxxxx这里malloclibc就说明刚才设置的分配器生效了。如果显示bits32那你是在 armv7l 环境编译的后续运行时要特别注意内存上限。5. 配置与托管让 Redis 作为 systemd 服务跑起来编译装好只是第一步真正要稳定运行还得把 Redis 托管给 systemd。5.1 为什么我用 systemd 而不是 daemonizeRedis 自带daemonize yes参数可以让它在后台以守护进程方式运行。但那意味着你得自己写 pid 文件、自己管理日志轮转、自己做开机自启这一套手工流程在服务器重启后很容易出岔子。既然系统里已经有 systemd直接写一个 service 文件托管起来崩溃自动拉起、开机自动启动省太多事。5.2 修改 redis.conf 关键项Redis 安装完成后不会有现成配置文件需要从源码目录拷贝sudo mkdir -p /etc/redis sudo cp /opt/src/redis-stable/redis.conf /etc/redis/redis.conf然后按需修改我列出几个重点项# 绑定本机回环地址还是所有网卡 bind 127.0.0.1 # 生产环境建议打开保护模式 protected-mode yes # 端口 port 6379 # 交给 systemd 托管不要自己 daemonize daemonize no supervised systemd # 设置访问密码至少要求业务方使用 AUTH requirepass YourStrongPassword # 日志文件路径 logfile /var/log/redis/redis-server.log # RDB 和 AOF 持久化文件存放目录 dir /var/lib/redis # 限制最大内存防止内存被打满拖垮整个 ARM 设备 maxmemory 256mb maxmemory-policy allkeys-lru重点解释两处。daemonize no配合supervised systemd是 systemd 托管时最稳妥的组合Redis 会在 systemd 环境下主动通知服务就绪。maxmemory在 ARM 设备上尤其重要因为很多开发板总共才 1GB 或 2GB 内存Redis 默认不限内存一旦数据量上来直接 OOM 影响整个系统。5.3 创建 systemd service 文件sudo vim /etc/systemd/system/redis.service内容如下[Unit] DescriptionRedis Server Afternetwork.target [Service] ExecStart/usr/local/redis/bin/redis-server /etc/redis/redis.conf ExecStop/usr/local/redis/bin/redis-cli -p 6379 shutdown Restartalways Userredis Groupredis RuntimeDirectoryredis RuntimeDirectoryMode0755 [Install] WantedBymulti-user.target这里Userredis建议单独创建系统用户不要用 root 运行 Redis这是安全底线sudo useradd --system --user-group redis sudo mkdir -p /var/lib/redis /var/log/redis sudo chown redis:redis /var/lib/redis /var/log/redis5.4 启动、验证与开机自启sudo systemctl daemon-reload sudo systemctl enable --now redis sudo systemctl status redis如果看到active (running)再用客户端验证/usr/local/redis/bin/redis-cli -a YourStrongPassword ping返回PONG就说明通了。如果连接报Connection refused先检查 bind 是否只绑了 127.0.0.1再检查防火墙是否放行 6379 端口。6. 跑一趟 redis-benchmark看看 ARM 平台的真实性能装好 Redis 之后的固定项目我会跑一遍自带基准测试心里有个性能底数。6.1 基准测试命令解析Redis 自带redis-benchmark一条命令就能看出大致吞吐/usr/local/redis/bin/redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 100000 -q -a YourStrongPassword参数含义参数作用-h指定 Redis 主机地址-p端口-c并发连接数-n总请求数100000 是为了让数据更有统计意义-qquiet 模式只输出最终结果-a指定密码认证6.2 重点关注哪些指标输出里会有一大串结果我最关注两个指标一是requests per second也就是每秒吞吐量二是P50/P99延迟这在响应式业务里比平均延迟更有参考价值。比如 Redis 单机 QPS 达到几万甚至十几万在普通业务场景下已经够用。6.3 ARM 平台上的性能差异与调优参考x86 服务器上 Redis 跑十万 QPS 不难ARM 设备则要看具体 CPU 型号。我实测过 RK3568 开发板和一颗 4 核 ARM 云主机 CPU在-c 50 -n 100000的参数下GET/SET 吞吐大致在 3 万到 6 万 QPS 左右P99 延迟在 1 到 3 毫秒。这个数据供参考不同 arm64 芯片差异很大。如果明显偏低先查 CPU 频率是不是被节能策略限制了# 查看当前 CPU 频率 cat /proc/cpuinfo | grep cpu MHz # 临时切到 performance 模式具体路径以内核接口为准 sudo cpupower frequency-set -g performance存储 IO 也很关键。如果 Redis 开了 AOF 持久化而你的 ARM 设备用的是 SD 卡或 eMMC写入性能会直接影响延迟。有条件的话把dir指向高速固态盘不要放在 TF 卡上。7. 编译与启动阶段的常见报错我的排查记录最后这部分我把在 ARM 平台实际操作中遇到的报错和排查思路记录下来希望能帮你少走弯路。7.1 jemalloc 缺失导致的编译失败这是我在新环境遇到最多的问题。报错信息往往出现在 make 初期提示/bin/sh: 1: cc: not found是没装 gcc但如果提示murmur或je_相关符号未定义多半就是 jemalloc 的问题。排查链路sudo apt install -y libjemalloc-dev再次make如果还是报错用make distclean清理直接改用make MALLOClibc绕开 jemalloc7.2 systemd 相关头文件找不到我在 Ubuntu 上遇到过编译 Redis 时找不到sd_notify相关符号的情况原因就是缺libsystemd-dev。补装依赖后需要重新make distclean再编译否则旧的编译缓存会继续报错。7.3 32 位 ARM 环境下的编译问题如果是 armhfarmv7l编译时大概率会遇到内存不足的问题。建议make -j1串行编译并且关掉不必要的服务释放内存。还有一个细节32 位 Redis 默认只能使用 4GB 以下内存如果你的开发板有 8GB 内存也建议把maxmemory设成 3GB 以内避免寻址异常带来的奇怪问题。7.4 启动时提示 Cant open the log file: Permission denied这个坑我踩过一次。原因是/var/log/redis目录权限不对Redis 用户无法写日志。解决办法很简单确认目录属主是 redis 用户或者把配置里的logfile指向 home 目录下的文件。最后再分享两个小技巧第一个编译安装 Redis 后可以把/usr/local/redis/bin加到 PATH 里echo export PATH$PATH:/usr/local/redis/bin ~/.bashrc source ~/.bashrc这样redis-cli随时能用不用每次敲全路径。第二个ARM 设备上做 Redis 缓存时建议把maxmemory-policy明确设置成allkeys-lru或volatile-lru。我见过不少同事装好 Redis 之后完全不限制内存结果数据量一上来把开发板内存吃满整个系统卡死最后只能强制断电重启。我在 ARM 云主机上完整走了几遍这套流程之后最大的感受是ARM 平台装 Redis 并没有想象中那么特殊关键就是把架构认知、编译依赖、服务托管和性能基准这几件事理清楚。以后无论是树莓派在家折腾还是 ARM 服务器上生产部署照着这个思路都能稳稳跑起来。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑