php 读取网站文件,wordpress 纯文字主题,响应式网站背景,动漫制作与设计专业本文主要向大家介绍了线上MySQL数据库机器内存爆掉原因分析与解决#xff0c;通过具体的内容向大家展现#xff0c;希望对大家学习MySQL数据库有所帮助。现象#xff1a;阿里金融某业务的MySQL机器的内存每隔几天就会增长#xff0c;涨上去后#xff0c;却不下来。累积后内…本文主要向大家介绍了线上MySQL数据库机器内存爆掉原因分析与解决通过具体的内容向大家展现希望对大家学习MySQL数据库有所帮助。现象阿里金融某业务的MySQL机器的内存每隔几天就会增长涨上去后却不下来。累积后内存爆掉。分析此业务是间隔的对MySQL有大访问其它时间几乎无访问。排查发现内存涨时一般会有MySQL读非常大主要是InnoDB_DATA_READS。结合此时的特性业务同学给出此时的主要场景1、14个线程并发2、写入数据流程先查询再updateselect pid,value from tableName where id?;查不到“idpid”的记录执行如下语句insert into tableName values ( id,pid,value,now() ) on duplicate key update valuevalues(value) ;查到“idpid”的记录执行如下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 COMMAND3018 mysql 20 0 44.2g 41g 4232 S 0.0 86.8 981:52.36 /u01/mysql/libexec/mysqld$ free -mtotal used free shared buffers cachedMem: 48384 46335 2048 0 344 2896-/ buffers/cache: 43094 5289Swap: 8191 8 8183flush之后PID USER PR NI VIRT RES SHR S %CPU %MEM TIME COMMAND3018 mysql 20 0 34.7g 30g 4248 S 0.3 65.5 981:55.64 /u01/mysql/libexec/mysqld$ free -mtotal used free shared buffers cachedMem: 48384 36010 12373 0 345 2898-/ buffers/cache: 32766 15617innodb层状态几乎没有变化———————-BUFFER POOL AND MEMORY———————-Total memory allocated 26361200640; in additional pool allocated 0Dictionary memory allocated 7723336Buffer pool size 1572863Free buffers 1Database pages 1556426Old database pages 574520Modified db pages 4Pending reads 0解决方法定时在业务低峰时flush tables或将相关的参数(table_open_cache 和 table_definition_cache)改小(从2048到512或更小)。本文由职坐标整理并发布希望对同学们学习MySQL有所帮助更多内容请关注职坐标数据库MySQL数据库频道