背景:生产环境,腾讯云2C4G MySQL实例,内存利用率一直横在79%+,稍微动一下就会超过80%触发报警策略。

mysql机器内存很大 mysql内存占用高_mysql机器内存很大

问题排查:

1. 查看连接数,没发现有长时间未释放的长链接

show full processlist;

2. 查看表高速缓存设置

SHOW VARIABLES LIKE '%table_open_cache%';

mysql机器内存很大 mysql内存占用高_问题排查_02

 查看表实际缓存状态

SHOW GLOBAL STATUS LIKE 'Open%tables';

mysql机器内存很大 mysql内存占用高_MySQL_03

 table_open_cache 与 Open_tables 值相等,但是Opend_tables值很大。说明MySQL正在释放缓存的表以容纳新的表,这个过程消耗资源。所以需要加大 table_open_cache的值,我们的MySQL实例是4G内存,这里我们改成2048。

问题解决:

mysql机器内存很大 mysql内存占用高_问题排查_04

改完之后,重启MySQL,内存利用率降低到20%左右,问题解决。

mysql机器内存很大 mysql内存占用高_mysql机器内存很大_05

内存占用也从原来的3200M降低到了800M。

mysql机器内存很大 mysql内存占用高_MySQL_06

备注:

table_open_cache合理值的建议:

Open_tables / Opened_tables >= 0.85
Open_tables / table_open_cache <= 0.95

实际操作过程中,可以把table_open_cache值设置得比Open_tables大一些,然后慢慢增加,逐步调试。