首页/数据/Redis 进阶速查/内存水位规划:给谁留余量
内存与管理99 条

内存水位规划:给谁留余量

为 maxmemory 设水位时预留三类余量:fork/重写时的写时复制、碎片与分配器损耗、系统与其他进程占用;常见经验是给系统留出可观比例。

Redis 进阶速查数据更新于 2026-10-13

水位该给谁留余量

给 maxmemory 设定水位,本质是回答「给谁留余量」。至少要留出三类空间:持久化 fork 时的写时复制峰值、碎片与分配器损耗、以及操作系统与其他进程的占用。把内存贴着上限跑,等于把故障留给业务高峰。

基本信息

预留一持久化与写时复制的内存峰值
预留二碎片与分配器损耗
预留三系统与其他进程占用
容器场景maxmemory 必须明显低于容器内存限制

典型使用场景

  • 新实例上线前确定 maxmemory 取值
  • 容器化部署时核算限制与实例上限的关系
  • 排查「已经设了 maxmemory 却被系统 OOM 杀掉」
  • 容量评审时给出扩容触发条件
  • 调整复制或持久化策略后复核余量是否仍足够

核算水位

核算水位
# 看实例自身水位与碎片比例
redis-cli INFO memory | grep -E 'used_memory_human|maxmemory_human|mem_fragmentation_ratio'
# 看系统层面的可用内存与 swap 使用
free -m
# 容器环境核对内存限制(cgroup v2 与 v1 路径不同)
cat /sys/fs/cgroup/memory.max 2>/dev/null || cat /sys/fs/cgroup/memory/memory.limit_in_bytes
# 持久化期间的写时复制影响
redis-cli INFO persistence | grep -E 'rdb_bgsave_in_progress|aof_rewrite_in_progress'
redis-cli INFO stats | grep latest_fork_usec

余量构成

余量项为什么要留参考做法
fork 与写时复制生成快照或重写期间的峰值占用按写入量评估,留出一份可观比例
碎片与分配器实际占用高于分配量预留一到两成更稳
系统与其他进程系统、监控、日志都要内存不把内存全部交给实例
cgroup 限制限制低于实例上限会先被内核杀限制明显高于实例上限加余量
主从角色差异从库有额外缓冲与复制开销从库比主库多留一档
留余量不是浪费:水位是安全边际,换来的是峰值期间仍能稳定服务。多数事故复盘里都能找到「配置贴着上限」这一条共同特征。
容器环境最常见的事故形态是内存限制小于 maxmemory 加余量:Redis 还没到自己的上限,进程已经被内核杀掉,触发的不是淘汰而是重启。

易错点

  • 按「数据量等于上限」规划 → 忽略复制与持久化的峰值需求,高峰即故障 → 按峰值场景核算并留出余量
  • 容器内存限制与 maxmemory 过于接近 → 先触发容器级 OOM 而不是 Redis 淘汰 → 让限制明显高于实例上限
  • 主从使用同一套水位 → 从库额外的复制与读缓冲无处安放 → 从库单独核算
  • 扩容只看内存占比 → 不结合淘汰速率与延迟信号,扩早浪费扩晚伤业务 → 关注淘汰、命中率与延迟的组合指标

数据来源与参考

  • Redis 官方文档:运维内存规划建议
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌