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键查看内存排名实际使用内存情况,