MySQL thread_stack連接線程的優化。本站提示廣大學習愛好者:(MySQL thread_stack連接線程的優化)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL thread_stack連接線程的優化正文
MySQL連接不僅能通過網絡方式,還可以通過命名管道的方式,不論是哪種方式連接MySQL,在MySQL中都是通過線程的方式管理所有客戶端請求的。每一個客戶端連接都會有一個與之對應的連接線程。在MySQL中實現了一個Thread Cache池,將空閒的連接線程存放其中,而不是完成請求後就銷毀。這樣,當有新的連接請求時,MySQL首先會檢查Thread Cache中是否存在空閒連接線程,如果存在則取出來直接使用,如果沒有空閒連接線程,才創建新的連接線程。具體參數:
Thread_cache_size:Thread Cache池中應該存放的連接線程數。
Thread_stack:每個連接線程被創建時,MySQL給它分配的內存大小。當MySQL創建一個新的連接線程時,需要給它分配一定大小的內存堆棧空間,以便存放客戶端的請求的Query及自身的各種狀態和處理信息。
查看連接線程相關的系統變量的設置值: show variables like 'thread%';
mysql> show variables like 'thread%';
+-------------------+--------+
| Variable_name | Value |
+-------------------+--------+
| thread_cache_size | 32 |
| thread_stack | 196608 |
+-------------------+--------+
2 rows in set (0.00 sec)
如圖,系統設置了Thread Cache池最多將緩存25個連接線程,每個連接線程創建之初,系統分配192KB的內存堆棧給它。
查看系統被連接的次數及當前系統中連接線程的狀態值
mysql> show status like 'connections';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Connections | 620 |
+---------------+-------+
1 row in set (0.00 sec)
mysql> show status like '%thread%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| Delayed_insert_threads | 0 |
| Slow_launch_threads | 0 |
| Threads_cached | 3 |
| Threads_connected | 4 |
| Threads_created | 7 |
| Threads_running | 1 |
+------------------------+-------+
6 rows in set (0.00 sec)
系統啟動到現在共接受到客戶端的連接620次,共創建了7個連接線程,當前有1個連接線程處於和客戶端連接的狀態,而3個連接狀態的線程中只有一個處於 active 狀態,即只有一個正在處理客戶端提交的請求,。而在Thread Cache池中共緩存了3個連接線程。
Thread Cache 命中率:
Thread_Cache_Hit = (Connections - Threads_created) / Connections * 100%;
一般在系統穩定運行一段時間後,Thread Cache命中率應該保持在90%左右才算正常。
實際應用:
針對16G/32G的機器,一般設置 512K
當然如果遇到下面的錯誤提示就應該考慮增加這個值了。
mysql-debug: Thread stack overrun
bug info
報錯信息:
java.sql.SQLException: Thread stack overrun: 5456 bytes used of a 131072 byte stack, and 128000 bytes needed. Use 'mysqld --thread_stack=#' to specify a bigger stack.
官方相應信息:
The default (192KB) is large enough for normal operation. If the thread stack size is too small, it limits the complexity of the SQL statements that the server can handle, the recursion depth of stored procedures, and other memory-consuming actions
可以使用
show variables where `variable_name` = 'thread_stack';
查詢當前數據庫的默認線程棧的大小,一般情況下都能正常使用,但是當查詢語句或者存儲過程復雜時會報Thread stack overrun錯誤,此時只要修改默認配置就可以。
解決
windows: 修改mysql安裝目錄下的my-small.ini或者my.ini設置為256k,或者更大,然後重啟服務
[mysqld]
thread_stack = 256k
linux: 同樣要修改配置文件,但是!!!,不是安裝目錄下的配置文件,是/etc/my.cnf,只有這個文件才能生效,然後重啟服務service mysql restart
[mysqld]
thread_stack = 256k