背景:
MySQL實例利用率一直居高不下
問題排查:
1. 查看連接數,沒發現有長時間未釋放的長鏈接
mysql> show full processlist;
2、查看表高速緩存設置
mysql> show variables like '%table_open_cache%';
3、查看實際緩存狀態
mysql> show global status like 'open%tables%'; +---------------+--------+ | Variable_name | Value | +---------------+--------+ | Open_tables | 785 | | Opened_tables | 508331 | +---------------+--------+
table_open_cache 與 Open_tables 值相等,但是Opend_tables值很大。說明MySQL正在釋放緩存的表以容納新的表,這個過程消耗資源。所以需要加大 table_open_cache的值,我們的MySQL實例是4G內存,這里我們改成2048。
4、變更設置
臨時修改:
mysql> set global table_open_cache = 2048;
配置文件修改:
[mysqld] table_open_cache = 2048
5、table_open_cache合理值的建議
Open_tables / Opened_tables >= 0.85
Open_tables / table_open_cache <= 0.95
實際操作過程中,可以把table_open_cache值設置得比Open_tables大一些,然后慢慢增加,逐步調試。
調大 table_open_cache 參數值,減少業務表頻繁打開和關閉。至於調整到多少合適,查看 MySQL 狀態參數 Open_tables 和 Opened_tables,當 Open_tables 接近 table_open_cache,並且 Opened_tables 不會快速增加時,那么此時的 table_open_cache 值就是一個比較合適的值。
table_open_cache 也不是越大越好,畢竟在表多的時候,也需要更多的內存消耗。
除了 table_open_cache 之外,還有兩個參數,可以一起關注一下:
- table_open_cache_instances
- table_definition_cache
如果 table_open_cache_instances 設置過小,在高並發場景下,可能導致 MySQL 內部線程嚴重的mutex 競爭