Redis容器中报OOM但used_memory远低于maxmemory且宿主机内存充足,属cgroup感知失效导致的伪OOM:Redis 6.2+自动读取cgroup内存限制失败,fallback至系统总内存,造成maxmemory配置过高;应手动设为容器limit的80%~90%,并启用activedefrag与合适hz值优化碎片整理。

Redis 在容器环境(如 Docker、Kubernetes)中报 OOM command not allowed,但 INFO memory 显示 used_memory 远低于 maxmemory,且 free -h 查宿主机内存充足——这类“伪 OOM”往往不是 Redis 自身内存超限,而是它无法感知容器的内存限制(cgroup v1/v2),导致 maxmemory 配置失当或内存统计失真。
确认是否为 cgroup 感知失效问题
Redis 6.2+ 默认尝试读取 /sys/fs/cgroup/memory.max(cgroup v2)或 /sys/fs/cgroup/memory/memory.limit_in_bytes(cgroup v1)来自动设置 maxmemory。若失败,它会 fallback 到系统总内存,从而在容器中严重高估可用内存。
执行以下命令验证:
-
redis-cli INFO memory | grep -E "(used_memory|maxmemory|mem_fragmentation_ratio)"——看maxmemory是否远大于容器实际限制(如显示maxmemory:137438953472即 128GB,但容器只分配了 2GB) -
cat /sys/fs/cgroup/memory.max 2>/dev/null || cat /sys/fs/cgroup/memory/memory.limit_in_bytes 2>/dev/null——检查容器内能否读取到正确限制值(正常应返回类似2147483648) -
cat /proc/1/cgroup——确认是否挂载了 memory controller(含memory::/...行)
手动强制设置 maxmemory(推荐)
不要依赖 Redis 自动探测。在容器启动时,通过 redis.conf 或运行时命令明确设为容器内存限制的 80%~90%,预留空间给元数据、客户端缓冲区和碎片。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 在
redis.conf中写死:maxmemory 1800mb(假设容器 limit=2Gi) - 或启动时传参:
redis-server /usr/local/etc/redis.conf --maxmemory 1800mb - 若用 Helm 或 K8s Deployment,通过
env+command注入:command: ["sh", "-c", "redis-server /usr/local/etc/redis.conf --maxmemory $REDIS_MAXMEMORY"],再定义REDIS_MAXMEMORY: "1800mb"
启用 cgroup v2 兼容与自动适配(Redis 7.0+)
Redis 7.0 引入 oom-score-adj 和更健壮的 cgroup 探测逻辑。确保:
- 宿主机启用 cgroup v2(
cat /proc/cmdline | grep systemd.unified_cgroup_hierarchy应含1) - 容器运行时支持 cgroup v2(Docker ≥ 20.10,默认启用;K8s ≥ 1.22,默认开启)
- Redis 配置中启用自动检测:
maxmemory-policy allkeys-lru+maxmemory-samples 10,并确保未设置maxmemory(让其自动生效)
注意:即使启用自动适配,仍建议配合 CONFIG SET maxmemory 做最终校验,避免冷启动时探测延迟。
规避内存统计干扰项
容器内 used_memory_rss 可能包含共享内存页、未释放的 jemalloc 缓存等,造成误判。需同步优化:
- 在
redis.conf中启用主动内存整理:activedefrag yes,降低mem_fragmentation_ratio - 调大
hz(如hz 20)提升后台任务频率,加快过期键回收和碎片整理 - 禁用非必要功能减少开销:
lazyfree-lazy-eviction no(除非确认需要异步淘汰) - 避免在容器内运行
KEYS *或未分页的SCAN,防止临时内存暴涨

















