Redis 内存明明没满却报 OOM:maxmemory、碎片率与客户端输出缓冲核对
线上 Redis 返回 OOM command not allowed when used memory > 'maxmemory' 时,先别只看监控面板上的“已用内存”。Redis 的淘汰判断、分配器保留的 RSS、客户端输出缓冲和大 key 会落在不同的观测口径里;其中任何一项没有对上,都可能出现“看起来还没满,写入却失败”。
used_memory是 Redis 逻辑分配口径,used_memory_rss还包含分配器保留的常驻内存,两者不能直接相减后下结论。maxmemory的淘汰空间与复制、AOF 缓冲等不计入淘汰的内存要分开检查,先读INFO memory。- 发布/订阅、慢客户端或大批量响应会把客户端输出缓冲推高,必要时单独看
maxmemory-clients和CLIENT LIST。 - 处理顺序建议是确认限制口径、定位额外占用、找出大 key,最后才调整淘汰策略或内存上限。
先把 Redis 的“内存没满”拆成三种口径
最容易误判的是把操作系统的 RSS 图表当成 Redis 的淘汰计数,或者反过来只看 used_memory。先执行:
redis-cli INFO memory | egrep 'used_memory:|used_memory_rss:|used_memory_peak:|maxmemory:|maxmemory_policy:|mem_not_counted_for_evict:|mem_fragmentation_ratio:'
used_memory 表示 Redis 记录的已分配内存,used_memory_rss 是进程从操作系统角度占用的常驻内存,maxmemory 是配置的逻辑上限。RSS 比逻辑占用高,并不等于 Redis 已经把可淘汰数据算满;这通常与 jemalloc 碎片、释放后未立即归还内核有关。

maxmemory 之外的占用要看 mem_not_counted_for_evict
如果实例开启了复制或 AOF,复制缓冲、AOF rewrite 缓冲等内存可能不计入淘汰判断,但仍然会挤压进程的整体资源。INFO memory 中的 mem_not_counted_for_evict 是第一处核对点:
redis-cli INFO memory | egrep 'mem_not_counted_for_evict|mem_clients_normal|mem_clients_slaves|mem_aof_buffer|mem_replication_backlog'
不要把这个字段简单加到 used_memory 上就当作 Redis 的精确 OOM 公式。它更适合回答“有多少内存没有进入淘汰空间”。同时检查 maxmemory-policy:如果是 noeviction,可写命令在达到上限后会直接失败;如果是 allkeys-lru 或 volatile-ttl,还要确认确实存在可淘汰的键。
| 观察项 | 回答的问题 | 不能直接推出 |
|---|---|---|
used_memory | Redis 逻辑上分配了多少 | 进程 RSS 是否马上下降 |
used_memory_rss | 进程常驻内存有多大 | 淘汰器是否已经达到 maxmemory |
mem_not_counted_for_evict | 哪些额外内存不进入淘汰空间 | 所有 OOM 的唯一原因 |
maxmemory_policy | 达到上限时是否淘汰、淘汰什么 | 一定能找到可淘汰键 |
碎片率高时,先判断是暂时保留还是持续增长
可以用一个粗略信号观察分配器状态:
redis-cli INFO memory | egrep 'used_memory:|used_memory_rss:|mem_fragmentation_ratio:' redis-cli MEMORY STATS
mem_fragmentation_ratio 明显高于 1,常见原因是大量不同尺寸的 key 反复创建和删除。它说明 RSS 相对逻辑分配偏高,但不表示可以无条件执行整理操作。先确认业务写入仍在增长,观察 used_memory_peak、RSS 和 key 数量的趋势;如果逻辑内存已经接近 maxmemory,优先处理数据生命周期和淘汰策略,而不是只盯着碎片率。
如果实例允许维护窗口,可以在确认没有并发大对象操作的前提下评估 MEMORY PURGE。它影响的是分配器可归还的空闲页,不能删除业务 key,也不能替代对大 key 和客户端缓冲的排查。
客户端输出缓冲可能把最后一段空间吃掉
普通命令客户端、订阅客户端和副本客户端的输出缓冲都可能不同。先看全局统计,再找异常连接:
redis-cli INFO clients | egrep 'connected_clients|blocked_clients|client_recent_max_input_buffer|client_recent_max_output_buffer|mem_clients_' redis-cli CLIENT LIST
在 CLIENT LIST 中重点看 omem(输出缓冲字节数)、obl、oll、cmd 和连接地址。某个订阅者长期不读消息,或者一次查询返回很大的集合,都会让 omem 持续上升。Redis 7.2 之后还可以结合 maxmemory-clients 观察客户端缓冲是否有独立上限;不要为了消除告警直接踢掉所有业务连接。

最后用 MEMORY USAGE 找出真正的大 key
全量扫描会给生产实例带来额外压力,先用抽样式的 --bigkeys 找方向,再对候选 key 精确测量:
redis-cli --bigkeys -i 0.01 redis-cli MEMORY USAGE 'cache:feed:user:10086' SAMPLES 10
--bigkeys 按数据类型报告采样到的最大对象,MEMORY USAGE 返回单个 key 的近似字节数。对 Stream、Hash、Sorted Set 等结构,还要结合成员数量和访问模式判断是否应拆分;直接删除大 key 可能造成同步阻塞,可以采用分批删除或在业务低峰使用异步删除策略,并观察延迟和复制积压。
一条不容易误伤生产的处理顺序
- 保存
INFO memory、INFO clients、CONFIG GET maxmemory*和错误时间点,先固定观测口径。 - 核对
maxmemory-policy与可淘汰键类型;noeviction场景不要误以为系统会自动清理。 - 检查
mem_not_counted_for_evict、AOF/复制缓冲和CLIENT LIST的omem,把额外占用归类。 - 对大 key 做抽样和分批处理,记录处理前后的延迟、RSS、复制偏移和错误率。
- 最后再评估修改
maxmemory或淘汰策略,并为回滚保留原配置。
常见问题
used_memory 没到 maxmemory,为什么写命令仍然 OOM?
先确认错误是否来自 Redis 本身,再核对实际生效的 maxmemory、策略和命令类型。复制/AOF缓冲、客户端输出缓冲或策略为 noeviction 都可能改变写入结果,不能只看一个监控指标。
mem_fragmentation_ratio 高是不是马上要重启?
不一定。先看逻辑内存、RSS、峰值和趋势;短时删除潮可能留下可复用的分配器空间。重启会带来切换和恢复成本,应把它作为有计划的维护动作,而不是碎片率单指标触发器。
CLIENT LIST 里的 omem 很大怎么处理?
先按连接的 cmd、地址和业务角色确认慢消费者,再降低单次响应规模、修复订阅读取或设置合适的客户端缓冲策略。直接批量断连接可能造成重连风暴。
maxmemory-policy 改成 allkeys-lru 就不会 OOM 了吗?
不能保证。实例可能没有足够可淘汰键,复制/AOF和客户端缓冲也不等于普通缓存数据。策略变更前要确认数据是否允许丢弃,并用压测或灰度观察命中率、延迟和错误率。
收尾核对
Redis OOM 的排查重点不是找一个“神奇阈值”,而是把逻辑数据、分配器 RSS、淘汰外内存、客户端缓冲和大 key 放回同一条时间线上。留下同一时刻的命令输出与配置快照,再做调整,通常比直接扩大内存上限更快找到根因。
Go encoding.TextMarshaler 怎么统一配置值序列化:JSON、日志与空值边界
- 上一篇
- Go encoding.TextMarshaler 怎么统一配置值序列化:JSON、日志与空值边界
- 下一篇
- 多模态模型识别表格为什么漏列:输入预处理、坐标校验与纠错
-
- 数据库 · Redis | 6小时前 | Redis · Redis性能 · 延迟排查 · 运维监控 · Redis LATENCY HISTOGRAM Redis 延迟直方图 命令耗时分布 latency-tracking
- Redis LATENCY HISTOGRAM 怎么看命令耗时分布:采样开关、百分位与实例核对
- 339浏览 收藏
-
- 数据库 · Redis | 7小时前 | Redis · Redis Cluster · 故障排查 · Pub/Sub · Redis Cluster Redis PUBSUB SHARDCHANNELS Redis 分片订阅 SHARDNUMSUB
- Redis PUBSUB SHARDCHANNELS 怎么核对分片订阅:频道可见性、节点范围与故障排查
- 228浏览 收藏
-
- 数据库 · Redis | 10小时前 | Redis · 内存管理 · 性能排查 · 碎片率 · 运维验证 · redis 内存回收 INFO memory allocator_frag_ratio 内存碎片率
- Redis INFO memory 怎么看碎片率:allocator_frag_ratio、峰值与回收验证
- 261浏览 收藏
-
- 数据库 · Redis | 13小时前 | Redis · set · 性能边界 · 集合运算 · SINTERCARD · redis limit 集合交集 SINTERCARD 交集数量
- Redis SINTERCARD 如何只取交集数量:LIMIT、键类型与集群边界
- 331浏览 收藏
-
- 数据库 · Redis | 18小时前 | Redis · 缓存 · 性能优化 · 内存管理 · 缓存淘汰 Redis LFU allkeys-lfu lfu-decay-time
- Redis LFU 淘汰为什么不按访问次数排序:衰减周期、热点误判与验收
- 101浏览 收藏
-
- 数据库 · Redis | 19小时前 | Redis · 集群 · PubSub · 消息通信 · redis Redis Cluster SPUBLISH SSUBSCRIBE 分片发布
- Redis SPUBLISH 怎么做分片发布:频道哈希、订阅范围与消息验收
- 119浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ljg-skills
- ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
- 5305次使用
-
- MELO音乐
- MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
- 4820次使用
-
- UniScribe
- UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
- 4759次使用
-
- 剧云
- 剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
- 5026次使用
-
- 万象有声
- 万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
- 4965次使用
-
- Redis SET 的 GET 与 KEEPTTL 怎么一起验收:旧值返回、续期与回滚边界
- 2026-08-20 501浏览
-
- Redis 慢命令快照小工具:用 SLOWLOG 定位接口延迟
- 2026-06-29 501浏览
-
- Redis集群节点规划与部署全解析
- 2025-08-02 501浏览
-
- 多线程Redis优化技巧分享
- 2025-06-29 501浏览
-
- 不同环境Redis安全配置对比与优化方法
- 2025-06-24 501浏览

