背景:生产环境,腾讯云2C4G MySQL实例,内存利用率一直横在79%+,稍微动一下就会超过80%触发报警策略。
问题排查:
1. 查看连接数,没发现有长时间未释放的长链接
show full processlist;
2. 查看表高速缓存设置
SHOW VARIABLES LIKE '%table_open_cache%';
查看表实际缓存状态
SHOW GLOBAL STATUS LIKE 'Open%tables';
table_open_cache 与 Open_tables 值相等,但是Opend_tables值很大。说明MySQL正在释放缓存的表以容纳新的表,这个过程消耗资源。所以需要加大 table_open_cache的值,我们的MySQL实例是4G内存,这里我们改成2048。
问题解决:
改完之后,重启MySQL,内存利用率降低到20%左右,问题解决。
内存占用也从原来的3200M降低到了800M。
备注:
table_open_cache合理值的建议:
Open_tables / Opened_tables >= 0.85
Open_tables / table_open_cache <= 0.95
实际操作过程中,可以把table_open_cache值设置得比Open_tables大一些,然后慢慢增加,逐步调试。