记一次mysql内存占用过大-不释放问题排查

问题描述:

接线上报警,mysql所在服务器内存剩余不足,这个实例内存问题是周期性爆发的,通过监控看到内存平均2天就被用尽掉256GB。

排查思路:

1、单个实例占用内存256GB,首先想到的是bufferpool,确认配置

show global variables like '%innodb_buffer_pool_size%';

30GB,

SELECT @@innodb_buffer_pool_instances;

innodb_buffer_pool_instances配置的是1

2、查看当前实例内存表占用

SELECT SUM(max_data_length)/1024/1024 AS MEMORY_MB FROM information_schema.tables WHERE ENGINE='memory';
64MB

3、当前实例非系统账号连接为5,所以计算session共占用最大内存为:

SELECT ( ( @@read_buffer_size
+ @@read_rnd_buffer_size
+ @@sort_buffer_size
+ @@join_buffer_size
+ @@binlog_cache_size
+ @@thread_stack
+ @@max_allowed_packet
+ @@net_buffer_length )
) / (1024*1024)*8 AS MEMORY_MB;

315MB

问题总是让我们秃头,通过free -g查看,cache占用非常的大,想起来numa这个东东,接下来抱着试一试的态度执行了以下操作:

1)mysql开启numa interleave访问(mysql_safe中增加一行代码,不知的同学自行搜一下哈)

2)重启实例,问题解决

总结:之前遇到的内存问题,一般都是因为bp配置过高,或者连接数猛增配置不合理导致的。这里顺便推荐一款mysql内存计算器,http://www.mysqlcalculator.com/ 用于查看你的内存配置是否合理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章