👌 好的,我帮你把 关闭交换分区 (Swap) 和 vm.overcommit_memory=1 一起加进最终的 blog 文章里。这样记录下来就是一份生产可用的完整方案。
在 AlmaLinux 9 使用 Podman 部署 Redis 7.4.5 并优化内核参数
在生产环境中运行 Redis 时,除了容器编排和持久化配置,还需要注意宿主机的内核参数调优。本文记录了我在 AlmaLinux 9 上使用 Podman 5.4.0 部署 Redis 7.4.5 的过程,并解决了 Redis 启动时出现的 Memory overcommit 警告,同时关闭了交换分区 (Swap),提升稳定性。
系统与版本信息
-
操作系统:AlmaLinux 9
-
Podman 版本:5.4.0
-
Redis 镜像:docker.io/library/redis:7.4.5
使用 Quadlet 管理 Redis 容器
Podman 提供了 Quadlet,可以直接通过 systemd 管理容器。
在 /etc/containers/systemd/redis7.container 中写入如下配置文件:
[Unit]
# 服务描述
Description=Redis 7.4.5 (Podman, LAN access, no password)
# 等待网络上线后再启动
After=network-online.target
Wants=network-online.target[Container]
# 指定 Redis 镜像,固定版本号,避免升级导致兼容性问题
Image=docker.io/library/redis:7.4.5# 容器名称(systemd/Podman 内部引用)
ContainerName=redis7# 端口映射:宿主机 6379 → 容器 6379
# 如只允许本机访问,可写成 127.0.0.1:6379:6379
PublishPort=6379:6379# 数据持久化目录映射
# 宿主机 /opt/redis/data → 容器 /data
# 选项 :Z 确保 SELinux 下正确挂载
Volume=/opt/redis/data:/data:Z# Redis 启动命令与参数(必须写在一行)
# --bind 0.0.0.0 → 监听所有网卡(允许外部访问;建议配合防火墙限制来源 IP)
# --protected-mode no → 关闭保护模式(默认无密码仅允许本机访问,这里显式关闭)
# --appendonly yes → 开启 AOF 持久化,保证写入数据可恢复
# --appendfsync everysec → AOF 每秒 fsync 一次,兼顾性能与可靠性
# --save 900 1 → 900 秒内至少 1 次写操作时生成 RDB 快照
# --save 300 10 → 300 秒内至少 10 次写操作时生成 RDB 快照
# --save 60 10000 → 60 秒内至少 10000 次写操作时生成 RDB 快照
Exec=redis-server --bind 0.0.0.0 --protected-mode no \--appendonly yes --appendfsync everysec \--save 900 1 --save 300 10 --save 60 10000[Install]
# 指定默认目标,保证开机自启
WantedBy=multi-user.target
启用服务:
systemctl daemon-reload
systemctl enable --now redis7
内核调优:vm.overcommit_memory 与关闭 Swap
1. 解决 Redis 警告:vm.overcommit_memory
Redis 启动时如果看到:
WARNING Memory overcommit must be enabled!
说明内核参数 vm.overcommit_memory 还是默认的 0,这会导致 Redis 在做 RDB/AOF/复制时 fork() 失败。
解决办法:写入 sysctl 配置并加载。
echo "vm.overcommit_memory = 1" > /etc/sysctl.d/99-redis.conf
sysctl --system
验证:
sysctl vm.overcommit_memory
# 输出应为:vm.overcommit_memory = 1
2. 关闭 Swap(推荐)
Redis 官方建议不要使用交换分区,否则可能造成极端性能抖动。
临时关闭:
swapoff -a
永久关闭:编辑 /etc/fstab,注释掉 swap 行,例如:
#/dev/mapper/alma-swap none swap defaults 0 0
然后再次执行:
swapoff -a
验证:
free -h
# Swap 一栏应为 0
验证 Redis 是否正常
redis-cli -h 127.0.0.1 -p 6379 PING
# 输出:PONG
查看日志:
journalctl -u redis7 -n 50 --no-pager
确认没有 Memory overcommit 警告,Redis 进入 Ready to accept connections 状态。
总结
-
使用 Quadlet 结合 systemd 管理 Redis 容器,方便服务启停与日志查看。
-
调整 vm.overcommit_memory=1,避免 Redis 在持久化或复制时 fork() 失败。
-
关闭 Swap,减少 Redis 被调度到磁盘导致的性能抖动。
最终环境:
-
AlmaLinux 9
-
Podman 5.4.0
-
Redis 7.4.5
-
Quadlet 管理 + 内核优化(overcommit_memory=1 + 无 Swap)
这一组合适合直接用于生产环境。
要不要我在这篇 blog 里顺便加一节 firewalld 配置示例(比如只允许内网网段访问 6379),让它更贴近实际生产安全要求?