关于MySQL内存泄露如何排查的一些思路

MySQL使用内存上升90%!在运维过程中50%的几率,会碰到这样的问题。算是比较普遍的现象。

MySQL内存使用率过高,有诸多原因。普遍原因是使用不当,还有MySQL本身缺陷导致的。到底是哪方面的问题,那就需要一个一个进行排查。

下面介绍排查思路:

1.参数配置需要确认,内存是否设置合理

MySQL内存分为全局和线程级:

全局内存(如:innodb_buffer_pool_size,key_buffer_size,innodb_log_buffer_size)。线程级内存:(如:thread,read,sort,join,tmp等)只是在需要的时候才分配,并且在操作完毕之后就释放。线程级内存:线程缓存每个连接到MySQL服务器的线程都需要有自己的缓冲。默认分配thread_stack(K,k),空闲时这些内存是默认使用,除此之外还有网络缓存、表缓存等。大致评估会在1M~3M这样的情况。可通过pmap观察内存变化:

备注:query_cache_size8.0版本已经废弃掉了。

2.存储过程函数触发器视图

目前积累的使用经验中,存储过程函数触发器视图在MySQL场景下是不适合的。性能不好,又容易发现内存不释放的问题,所以建议尽量避免。

存储过程函数MySQL5.7

MySQL8.0

视图

触发器

上面通过MySQL配置参数和设计层面检查了是否有可能内存泄露的问题。下面看看怎样分析实际使用的内存情况。

3.系统库统计查询

总内存使用

分事件统计内存

账号级别统计

备注:有必要统计用户级别内存,因为很多环境对接了第三方插件,模拟从库,这些插件容易内存不释放。

线程对应sql语句,内存使用统计

打开所有内存性能监控,会影响性能,需注意

系统表内存监控信息

备注:找到对应问题事件或线程后,可以进行排查,解决内存高的问题。

4.系统工具查看内存

1)top命令

显示系统中各个进程的资源占用状况。

Shift+m键查看内存排名实际使用内存情况,


转载请注明:http://www.aierlanlan.com/rzdk/5126.html