問題描述:
接線上報警,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/ 用於查看你的內存配置是否合理