登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  数据库 >  Redis

Redis MEMORY DOCTOR 输出如何转成排查顺序

来源:17golang原创

时间:2026-09-15 15:23:19 277浏览 收藏

Redis 内存告警出现后,先执行 MEMORY DOCTOR 很合适,但不要把它当成“自动修复报告”。它给出的是内存问题线索,真正的排查顺序应是:先看报告指向哪一类,再用 INFO memoryMEMORY STATS 对照,最后才决定清理键、限制缓冲区、观察碎片或调整配置。

要点速览
  • MEMORY DOCTOR 负责提示方向,不能单独证明内存泄漏或数据集过大。
  • used_memoryused_memory_peakused_memory_rss 要结合观察,不能只看一个比值。
  • MEMORY STATS 用来拆分 dataset、overhead、客户端和复制/AOF 缓冲区,治理前后都要留记录。

先把 MEMORY DOCTOR 当作分类器

命令本身没有参数,复杂度为 O(1),返回一段内存问题报告。它可能提示当前实例的使用量、历史峰值、分配器碎片、进程 RSS 开销、客户端缓冲区或脚本缓存等方向。报告为空或偏保守,并不等于实例完全健康;反过来,出现提示也不意味着应该立即重启或执行清理。

# 先读取 Redis 的诊断摘要,不改变数据
redis-cli -h 127.0.0.1 -p 6379 MEMORY DOCTOR

# 用核心指标确认报告指向的内存层次
redis-cli -h 127.0.0.1 -p 6379 INFO memory | egrep 'used_memory:|used_memory_peak:|used_memory_rss:|allocator_frag_ratio:|allocator_frag_bytes:|mem_clients_normal:|mem_replication_backlog:|mem_aof_buffer:'

排查时先按下面的映射记录“信号—证据—动作”,避免看到 fragmentation 就直接调参数:

报告信号先核对的字段第一步动作
当前使用量持续上升used_memorydataset.bytes抽样大键、TTL 和业务写入增长
峰值远高于当前值used_memory_peakused_memory_rss结合业务峰值与回收时间观察 RSS 是否回落
分配器碎片或 RSS 偏高allocator_frag_ratioallocator_rss_ratio确认是持续碎片还是峰值释放后的可复用空间
客户端、复制或 AOF 缓冲区偏大mem_clients_normalmem_replication_backlogmem_aof_buffer转向连接、慢消费端、复制和持久化链路
Redis MEMORY DOCTOR 与 INFO memory 指标之间的静态信号分类说明图
图1:Redis 内存诊断的静态说明图,展示报告信号如何对应到当前用量、历史峰值、RSS 和分配器指标;不是截图或运行证据。

用 INFO memory 区分数据增长和历史峰值

used_memory 更接近 Redis 当前分配的内存,used_memory_peak 反映历史高点,used_memory_rss 则是进程在操作系统看到的常驻集。删掉键后 RSS 没有同步下降并不自动证明泄漏:分配器可能保留页面,以便后续复用。此时应连续采样,而不是用一次比值下结论。

如果 used_memorydataset.bytes 同时增长,优先查业务键的数量、值大小和 TTL;如果当前数据已经下降但 RSS 仍高,先看 used_memory_peakallocator_frag_bytes 和业务 churn 是否解释了差异。Redis 官方也提醒,峰值远高于当前使用量时,传统 fragmentation ratio 的解释会失真。

# 记录一份可比较的基线,输出只读指标
redis-cli INFO memory > /tmp/redis-info-memory.before
redis-cli MEMORY STATS > /tmp/redis-memory-stats.before

# 只对候选键做抽样,避免用 KEYS 阻塞生产实例
redis-cli --scan --pattern 'session:*' | head -n 20 | while read key; do
  # MEMORY USAGE 用来定位大值,抽样结果不能替代全量统计
  redis-cli MEMORY USAGE "$key"
done

用 MEMORY STATS 找到真正占内存的分组

MEMORY STATS 会把内存拆成可比较的指标:dataset.bytes 表示数据集,overhead.total 表示管理数据集所需的内部开销,另外还会列出普通客户端、复制 backlog、AOF buffer、脚本缓存和各数据库字典等部分。它比单看 used_memory_rss 更适合回答“内存到底花在哪里”。

例如,dataset.bytes 高,治理重点通常是键设计、值大小、过期策略和大键分布;clients.normal 高,则应检查客户端是否积压输出、是否存在慢消费连接;复制或 AOF 相关字段高,则要把复制延迟、网络和持久化窗口放进同一张排查表。不要把这些缓冲区误当成可被键淘汰策略直接解决的数据集。

Redis MEMORY STATS 的数据集内部开销客户端复制和 AOF 缓冲区关系说明图
图2:Redis 内存组成的静态边界说明图,展示 dataset 与 overhead、客户端、复制/AOF 缓冲区的关系;不是截图或运行证据。

按证据选择动作并验证结果

确认数据集偏大时,先从业务允许的键空间、TTL 和序列化格式入手;需要定位单键时使用 SCAN 配合少量 MEMORY USAGE 抽样。确认客户端缓冲区偏大时,检查连接生命周期和消费速度。确认碎片偏高时,先看趋势和分配器字段,再结合版本、部署方式和维护窗口评估主动碎片整理或内存回收能力。MEMORY PURGE 不是所有托管形态都支持,也不能替代根因治理。

一次有效验证至少保留四类结果:命令执行时间、used_memoryused_memory_rssdataset.bytes,再加上触发报告的缓冲区或碎片字段。治理后若数据集下降而 RSS 暂时平稳,先观察分配器是否复用空间;若客户端缓冲区反复升高,问题仍在连接或消费链路。只有趋势稳定,才算排查闭环。

相关问题

MEMORY DOCTOR 能直接判断内存泄漏吗?

不能。它提供内存问题报告,泄漏判断需要结合多次采样、业务写入/删除曲线和进程指标;单次报告只能帮助缩小方向。

为什么删除大量键后 RSS 还很高?

分配器可能保留已释放页面用于后续分配,历史峰值也会影响 RSS。先比较 used_memory_peakallocator_frag_bytes 和后续趋势。

INFO memory 和 MEMORY STATS 应该先看哪个?

先用 MEMORY DOCTOR 定方向,再用 INFO memory 看趋势和比值,最后用 MEMORY STATS 拆分组成;三者承担的判断粒度不同。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>