程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL thread_stack連接線程的優化

MySQL thread_stack連接線程的優化

編輯:MySQL綜合教程

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved