现象:
阿里金融某业务的MySQL机器的内存每隔几天就会增长,涨上去后,却不下来。累积后内存爆掉
分析:
此业务是间隔的对MySQL有大访问,其它时间几乎无访问。排查发现,内存涨时,一般会有MySQL读非常大,主要是InnoDB_DATA_READS。
结合此时的特性,业务同学给出此时的主要场景:
1、14个线程并发;
2、写入数据流程:先查询再update;
select pid,value from tableName where id=?;
查不到“id&pid”的记录,执行如下语句
insert into tableName values ( id,pid,value,now() ) on duplicate key update value=values(value) ;
查到“id&pid”的记录,执行如下
update tableName set value= ? where id=? and pid=?;
在分析过程,我们走了些弯路。现在回想,我们可能会从如下几个方面去思考:
1、近期升级过kernel,典型的阿里分库分表集群,其中一台升级未升级。所以,新版本内核相关性不大。
2、innodb内部统计的内存使用量,没有发现异常。
3、NUMA开关导致swap。这是MySQL swap中经常会讨论到的,但这几台没有开(线上也全部是关掉的)。
4、临时表、memory引擎表,可能会消耗大量的服务器端的内存,但业务没有用到或生成临时表。
5、连接所消耗内存。类似key_buffer_size等每个线程所占有的,是我们格外要注意的,但很明显,这点可以否定,因为并发连接一直很小。
6、table cache相关的内存。这点实现证明,效果非常明显,是我们排查问题的突破点。
7、真正的mysqld内存泄漏。结合业务的特性,在buglist中发现这个问题在很久很久之前确实存在并早已fix掉。
执行FLUSH TABLES发现mysqld的RSZ直接减少10G~
flush之前:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3018 mysql 20 0 44.2g 41g 4232 S 0.0 86.8 981:52.36 /u01/mysql/libexec/mysqld
$ free -m
total used free shared buffers cached
Mem: 48384 46335 2048 0 344 2896
-/+ buffers/cache: 43094 5289
Swap: 8191 8 8183
flush之后:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3018 mysql 20 0 34.7g 30g 4248 S 0.3 65.5 981:55.64 /u01/mysql/libexec/mysqld
$ free -m
total used free shared buffers cached
Mem: 48384 36010 12373 0 345 2898
-/+ buffers/cache: 32766 15617
innodb层状态几乎没有变化:
———————-
BUFFER POOL AND MEMORY
———————-
Total memory allocated 26361200640; in additional pool allocated 0
Dictionary memory allocated 7723336
Buffer pool size 1572863
Free buffers 1
Database pages 1556426
Old database pages 574520
Modified db pages 4
Pending reads 0
解决方法:
定时在业务低峰时flush tables或将相关的参数(table_open_cache 和 table_definition_cache)改小(从2048到512或更小)。
相关推荐
MySQL线上SQL捕获及分析
基于ssm+mysql线上会议管理系统设计与实现.docx基于ssm+mysql线上会议管理系统设计与实现.docx基于ssm+mysql线上会议管理系统设计与实现.docx基于ssm+mysql线上会议管理系统设计与实现.docx基于ssm+mysql线上会议...
完美Mysql 线上部署初始化
基于ssm+mysql快餐店线上点餐系统设计与实现.docx基于ssm+mysql快餐店线上点餐系统设计与实现.docx基于ssm+mysql快餐店线上点餐系统设计与实现.docx基于ssm+mysql快餐店线上点餐系统设计与实现.docx基于ssm+mysql...
MySQL线上常见故障剖析.pdf
内存溢出产生原因多种多样,当内存严重不足时,内核有两种选择: 直接panic 杀掉部分进程,释放一些内核。 大部分情况下,会杀掉导致OOM的进程,然后系统恢复。通常我们会添加对内存的监控报警,例如:当memory或...
MySQL内存统计的分析与实践
主要介绍了MySQL8.0内存相关参数总结,帮助大家更好的理解和学习mysql,感兴趣的朋友可以了解下
本文分享上线Mysql数据库日常维护的一些方法和常用工具
线上买菜-线上买菜系统-线上买菜系统源码-线上买菜管理系统-线上买菜管理系统java代码-线上买菜系统设计与实现-基于springboot的线上买菜系统-基于Web的线上买菜系统设计与实现-线上买菜网站-线上买菜网站代码-线上...
记一次排查线上MySQL死锁过程,不能只会curd,还要知道加锁原理.doc
MySql的内存数据库的信息 数据库基本操作
Java基于ssm+mysql的线上会议管理系统的实现.zipJava基于ssm+mysql的线上会议管理系统的实现.zipJava基于ssm+mysql的线上会议管理系统的实现.zipJava基于ssm+mysql的线上会议管理系统的实现.zipJava基于ssm+mysql的...
MySQL 内存分析 http://www.ossez.com/forum.php?mod=viewthread&tid=26837&fromuid=426 (出处: OSSEZ)
线上经验谈MySQL主从切换的一般步骤
MySQL 线上运维常见错误、疑难问题录,总结了非超多的问题