X侦探所事件薄 | 一次内存溢出之谜

2024-03-20 11:50

本文主要是介绍X侦探所事件薄 | 一次内存溢出之谜,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者 姜宇祥,曾就职于达梦和携程,目前在CDB/CynosDB数据库内核团队担任TXSQL云数据库内核研发,多年深耕数据库领域,为国内早期一批数据库内核研发人员。过去曾在达梦经历了新一代达梦从零开始的整个研发过程,并参与多个版本的迭代与架构调整;还曾在携程率先开启MySQL的定制开发,为线上业务提供支持。另一方面,他也积极参与MySQL开源社区在中国成长过程,通过技术宣讲与文章编写助力MySQL在中国的传播。

引言

在数字领域,TX王国是一个统御着“成T上P”数据子民的大国,这里的T和P是极大极大的数,用成千上万来形容数据量之多并不为过。X侦探事务所就是TX王国中负责MySQL领域管理数据子民的有关部门,而事务所中探员们就是专门负责解决各种各样突发事件的战斗精英。

我们将要讲述的是关于这些探员的侦探故事,他们擅长在海量的数据中追寻蛛丝马迹,屡破奇案。这次,我们将要讲述的是一个连环宕机血案的侦破故事。

案发现场

一天,探员T因遇到了一个棘手的MySQL实例宕机问题而头疼不已,通过内部的监控系统发现一个MySQL数据服务使用的内存就像坐了加了速的小汽车一样飞速上涨。操作系统为了保证整个系统的运行,不得不将该MySQL服务杀死,以释放足够的资源用于系统正常运转。这是一个很严重的问题,任何服务的宕机以及内存不正常现象都是要优先进行排查并处理。

内存溢出(Out Of Memory)

一般是由于程序编写者对内存使用不当,如没有及时释放申请的内存资源,导致该内存一直不能被再次使用而使计算机内存被耗尽的现象。杀死进程或重启计算机可从操作系统层面解决问题,但根本解决办法还是对代码进行改进。

image.png

案件经过

面对这种紧急情况,经验丰富的探员T迅速登录服务器查看情况。首先怀疑的是打开的表太多,导致大量的表对象占用了内存空间。经过对frm文件和ibd文件的底层粗略查询,该MySQL实例上有20多万张的表。那么,大量的表对象占用了内存空间的必要条件就成立了。于是进一步查看,限制表打开数目的变量“table_definition_cache”是否设置的过大,导致占用的内存过多。

但是,该变量并未如预期中设置的过大,属于合理范围。那么为什么内存还会占用如此之多?探员T此刻陷入了深深的思考。现在案件似乎走入了一个死胡同,也就是存在大量的表但是对打开表的资源限制在了一个合理的范围内ÿ

这篇关于X侦探所事件薄 | 一次内存溢出之谜的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/829367

相关文章

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

Redis 内存淘汰策略深度解析(最新推荐)

《Redis内存淘汰策略深度解析(最新推荐)》本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Rand... 目录一、 内存淘汰策略概述二、内存淘汰策略详解2.1 ​noeviction(不淘汰)​2.2 ​LR

spring @EventListener 事件与监听的示例详解

《spring@EventListener事件与监听的示例详解》本文介绍了自定义Spring事件和监听器的方法,包括如何发布事件、监听事件以及如何处理异步事件,通过示例代码和日志,展示了事件的顺序... 目录1、自定义Application Event2、自定义监听3、测试4、源代码5、其他5.1 顺序执行

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内