Mysql

如何強制更高的 open_files_limit 或 table_open_cache 值?

  • November 18, 2015

我有一個令人沮喪的問題,將 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 這樣的“消費者”作業系統的限制更加保守。檢查你的限制是什麼ulimitsysctl

引用自:https://dba.stackexchange.com/questions/52447