问题描述:
接线上报警,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/ 用于查看你的内存配置是否合理