首页/数据/Redis 进阶速查/容器内存限制与 maxmemory 的关系
内存与管理99 条

容器内存限制与 maxmemory 的关系

容器环境里 cgroup 限额先于 maxmemory 生效:RSS 触顶会直接触发 cgroup OOM 杀进程;maxmemory 应按限额留出余量设置并监控 RSS。

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

cgroup 限额与 maxmemory

容器里 Redis 能用的物理内存由 cgroup 限额决定:cgroup v2 对应 memory.max,cgroup v1 对应 memory/memory.limit_in_bytes,Kubernetes 里就是 resources.limits.memory。maxmemory 只是 Redis 自己的逻辑上限,用来触发键淘汰;两者作用对象不同,maxmemory 管数据区,cgroup 管整个进程的常驻内存。进程 RSS 一旦顶到 cgroup 红线,内核直接 OOM 杀进程(K8s 表现为 OOMKilled、退出码 137),Redis 没有机会执行淘汰或落盘,所以限额必须留出余量给复制缓冲、客户端缓冲和 fork 期间的写时复制。

基本信息

生效顺序cgroup 限额先于 maxmemory
cgroup v2 查看cat /sys/fs/cgroup/memory.max
cgroup v1 查看cat /sys/fs/cgroup/memory/memory.limit_in_bytes
K8s 对应项resources.limits.memory
建议取值maxmemory 取限额的 70%~80%
RSS 语义含分配器碎片与各类缓冲
调整权限容器内可读,改限额需编排层操作

典型使用场景

  • K8s 或 Docker 部署 Redis,需要确定 maxmemory 到底设多少
  • 实例被反复 OOMKilled,要区分是 Redis 自身问题还是限额撞顶
  • 内存水位告警设计时,为 RSS 与限额之间的差值单独设阈值
  • 排查 maxmemory 从未触发淘汰但进程已经死的矛盾现象
  • 给复制积压缓冲、客户端输出缓冲预留余量的容量规划
  • 多容器混部在同一台宿主机上,判断是节点内存还是容器限额先到顶

容器内确认限额与用量

容器内确认限额与用量
cat /sys/fs/cgroup/memory.max                  # cgroup v2 限额
cat /sys/fs/cgroup/memory.current              # 当前 cgroup 实际用量
redis-cli INFO memory | grep -E 'used_memory_rss|maxmemory'
redis-cli INFO memory | grep -E 'mem_fragmentation_ratio'
kubectl describe pod redis-0 | grep -i -A2 oom  # 查 OOM 证据
docker inspect -f '{{.State.OOMKilled}}' redis  # 容器是否被 OOM 杀过
kubectl top pod redis-0                        # 与限额对照看余量

内存指标对照

指标含义要点
used_memory分配器统计的逻辑用量淘汰判断依据
used_memory_rss操作系统视角的常驻内存比逻辑用量更早逼近 cgroup 红线
maxmemory触发淘汰的阈值需为复制与客户端缓冲留余量
mem_fragmentation_ratiorss 与逻辑用量之比比值高时 RSS 增长快于逻辑用量
memory.currentcgroup 统计的整进程用量含 Redis 之外的同容器进程
把 maxmemory 设成等于容器限额是常见事故源:复制积压缓冲、客户端缓冲与 fork 期间的写时复制都不在 maxmemory 计数里,RSS 会先撞线。
改 cgroup 限额通常要重建容器或调整编排配置,属有损操作;能用容量规划与 maxmemory 解决的,优先不动限额。
同容器里还跑着监控 agent、日志采集等进程时,它们的 RSS 也计入 cgroup 用量,限额评估要把这部分算进去。

易错点

  • maxmemory 贴着容器限额设置,碎片与各类缓冲先把 RSS 顶到红线,进程被 OOMKilled
  • 只监控 used_memory 不监控 used_memory_rss,被杀前看不到逼近限额的趋势
  • 把 OOMKilled 当 Redis 崩溃去翻 Redis 日志,内核基本没给 Redis 留下记录机会
  • 限额下调后忘记同步调小 maxmemory,进程在新的红线前就已越界
  • 忽略同容器内其他进程的内存占用,实际可用余量比账面更小

数据来源与参考

  • Redis 官方文档:容器化部署建议
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌