Mysql
如何強制更高的 open_files_limit 或 table_open_cache 值?
我有一個令人沮喪的問題,將 my.cnf 設置為高於我目前擁有的值不會“接受”。
這是 MacOS X 10.8.3 上的 MySQL 5.6.14
我正在嘗試解決連接斷開和其他看似與容量相關的問題。
例如:我的數據庫的目前統計數據是:
mysql> SHOW GlOBAL STATUS LIKE "%open%"; +----------------------------+--------+ | Variable_name | Value | +----------------------------+--------+ | Com_ha_open | 0 | | Com_show_open_tables | 0 | | Innodb_num_open_files | 1581 | | Open_files | 5557 | | Open_streams | 0 | | Open_table_definitions | 4199 | | Open_tables | 5000 | | Opened_files | 54805 | | Opened_table_definitions | 4247 | | Opened_tables | 8515 | | Slave_open_temp_tables | 0 | | Table_open_cache_hits | 104991 | | Table_open_cache_misses | 8479 | | Table_open_cache_overflows | 3459 | +----------------------------+--------+
我目前的 my.cnf 值為:
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES max_allowed_packet=128M wait_timeout=57600 table_open_cache = 5000 table-definition-cache = 10000 open_files_limit = 10000 max-connections = 15 thread-cache-size = 16K max-heap-table-size = 6024M tmp-table-size = 6024M query-cache-size = 256K query-cache-limit = 16M key_buffer = 512M long-query-time = 5 join-buffer-size = 1M innodb_buffer_pool_size = 3046M
這會產生:
mysql> SHOW VARIABLES LIKE '%open%'; +----------------------------+----------+ | Variable_name | Value | +----------------------------+----------+ | have_openssl | DISABLED | | innodb_open_files | 5000 | | open_files_limit | 10025 | | table_open_cache | 5000 | | table_open_cache_instances | 1 | +----------------------------+----------+ 5 rows in set (0.00 sec)
應該是哪個。
我想將我的開放限制提高到
table_open_cache = 10000 table-definition-cache = 20000 open_files_limit = 60000
但是當我這樣做時 my.cnf 似乎無效並且 mysql 報告:
mysql> SHOW VARIABLES LIKE '%open%'; +----------------------------+----------+ | Variable_name | Value | +----------------------------+----------+ | have_openssl | DISABLED | | innodb_open_files | 400 | | open_files_limit | 256 | | table_open_cache | 400 | | table_open_cache_instances | 1 | +----------------------------+----------+ 5 rows in set (0.00 sec)
這顯然會殺死我的伺服器。
從您的數字來看,您一定遇到了一些錯誤或 GA 前的行為。為什麼?
根據 MySQL 文件,對於 MySQL 5.6 的 GA 版本,table_open_cache 的預設值為 -1。這告訴 mysqld 在目前作業系統條件下選擇一個公平的起始值。使這個值變得奇怪的是400 是 MySQL 5.6.7 的預設值。第一個 GA 版本是 5.6.8。這可能是巧合,但我的猜測是您將 table_open_cache 設置得太高了。顯然,5000 對於您的數據庫伺服器來說是一個可以容忍的值。
建議
嘗試使用table_open_cache_instances將其設置為 2 或 4。然後重新啟動 mysql 並查看。
您可能已經最大化了每個程序的打開文件描述符總數。我在 FreeBSD 上發現了這個類似的討論,它談到了 160,000 個描述符,但我認為像 MacOS 這樣的“消費者”作業系統的限制更加保守。檢查你的限制是什麼
ulimit
。sysctl