查大Key导致OOM怎么定位_开启监控利用堆栈工具排查

夜伟吖_6917

夜伟吖_6917

2026-05-06

919人浏览

原创

redis-cli --bigkeys 仅统计序列化后字节数,不包含元数据开销、过期信息、访问频率及客户端缓冲区影响,实际内存占用通常高30%–100%。

查大key导致oom怎么定位_开启监控利用堆栈工具排查

redis-cli --bigkeys 扫描时为什么看不到真实内存占用?

redis-cli --bigkeys 只统计每个 key 的「序列化后字节数」,不包含 Redis 内部元数据开销(如 dictEntry、sds 头、指针等),实际内存占用通常比它显示的高 30%–100%。尤其对 hash 或 zset 类型,元素越多,额外开销越明显。

它也不区分 key 是否带过期时间(EXPIRE)、是否被频繁访问(影响 LRU/LFU 淘汰权重),更不会告诉你该 key 是否正在被客户端缓冲区大量读取(比如 CLIENT LIST 中 obuf 高的连接可能正卡在读一个大 list)。

  • 线上紧急排查时,优先用它快速筛出 top N 大 key,但别把它当唯一依据
  • 若扫描结果里没发现明显大 key,但 used_memory 持续飙升,重点看 mem_fragmentation_ratio 和 client_longest_output_list
  • 它不阻塞服务,但会遍历全库 —— 在高 QPS 实例上慎用,建议在低峰期执行

离线分析 RDB 文件时,-bytes 参数设多少才合理?

设 -bytes 1024 是常见起点,但实际要结合业务 value 分布来调。比如你业务中正常 string key 值基本在 500B 左右,那设 1024 就能覆盖异常;但如果普遍存 JSON,平均 8KB,再设 1024 就会刷出太多噪音。

更稳妥的做法是先用 INFO memory 查 used_memory 和 dbX 下 key 数量,粗算平均 key 占用:比如 2GB / 200 万 key ≈ 1KB/个,那么 -bytes 5000 更有诊断价值。

科学计算器在线使用工具代码
科学计算器在线使用工具代码

html5 css3制作在线科学计算器ui布局,3D计算器面板,加减乘除数字计算器工具特效。

下载
  • rdb_bigkeys 输出的 serializedlength 是压缩后长度,和 redis-cli --bigkeys 的值接近,但更准(因为基于磁盘文件,不含运行时缓存扰动)
  • 务必加 -sorted,否则输出无序,难定位 top 几个真凶
  • 线程数 -threads 4 在 8 核机器上够用;超过 8 线程收益递减,还可能抢 I/O

查到大 key 后,怎么确认它就是 OOM 根因?

不能只看单个 key 大小。关键要看它是否「高频+高内存+不可淘汰」:

  • 用 OBJECT FREQ keyname 查 LRU 频率(仅限 allkeys-lru 等策略下有效),值接近 255 表示刚被访问过
  • 用 TTL keyname 看是否永不过期 —— 永久 key + 大体积 = 长期占内存
  • 用 CLIENT LIST 找 obuf > 1MB 的连接,再用 CLIENT GETNAME 关联业务标识,确认是不是某个下游服务在轮询拉取这个大 list
  • 检查 maxmemory-policy:如果是 noeviction,写入大 key 直接触发 OOM command not allowed;如果是 allkeys-lru,但大 key 访问冷,也容易被误删导致业务异常

堆栈工具抓不到 Redis 进程?dmesg 和日志得一起看

Redis 是单线程 C 程序,没有 JVM 那种堆快照概念,所谓「堆栈」在这里指系统级现场:dmesg 看 OOM Killer 是否干掉了它,/var/log/redis/redis-server.log 看是否有 OOM command not allowed 报错,二者必须交叉验证。

如果 dmesg 有 Killed process redis-server (pid 12345),但 Redis 日志里没 OOM 报错,说明是系统层内存不足(比如其他进程吃光内存),Redis 只是被顺手 kill 的倒霉蛋。

  • 执行 dmesg -T | grep -i "killed process" | tail -20,注意时间戳是否贴近 Redis 宕机时刻
  • free -h 和 cat /proc/meminfo 中的 MemAvailable 比 MemFree 更真实反映可用内存
  • Redis 自身日志里的 used_memory_peak 如果远高于 maxmemory,说明之前就发生过内存尖峰,只是没立刻崩溃

真正卡住人的地方,往往不是找不到大 key,而是搞不清它为什么“活”着 —— 没过期、没被淘汰、还在被某个长连接反复读。定位时盯着 OBJECT FREQ 和 CLIENT LIST 的组合输出,比单纯看大小有用得多。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

6287

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2648

6

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

6287

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2648

6

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

20

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

20

15

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

2026.10.28

0

10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

120

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

60

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Gradle 安全最佳实践
Gradle 安全最佳实践

共0课时 | 0人学习

Gradle Wrapper 使用与安全指南
Gradle Wrapper 使用与安全指南

共0课时 | 0人学习

Golangci-lint命令行使用演示
Golangci-lint命令行使用演示

共0课时 | 0人学习