Thread pool引數引起的程式連線資料庫響應慢

haoge0205發表於2017-12-11
資料庫版本:percona-mysql 5.6.16

在很長一段時間,都會出現程式連線資料庫,出現響應慢的情況,正常在幾到幾十毫秒之間,但是偶爾會出現上百毫秒的情況;

開始由於開發重新設定並調整過程式連線池,一直懷疑是連線池的問題,但是問題依舊;


因為使用的版本是percona-mysql 5.6.16 並且使用了資料庫連線池。
Thread Pool根據引數thread_pool_size被分為若干個group,每個group維護client 發起的 connections,當MySQL建立 connection 時, 
MySQL 根據connection的thread id 對thread_pool_size取模,將connection 發起的sql 語句分配到對應的group。每個group的最大worker
數量為thread_pool_oversubscribe+1。若worker達到最大數量後還是不足以處理回話請求,則連線在本group上等待,導致sql 語句的rt 增大;

因此將thread_pool_oversubscribe引數調大,但是問題依舊;

檢查thread_cache_size,伺服器記憶體大小為64G,thread_cache_size=128;
每建立一個連線,都需要一個執行緒來與之匹配,此引數用來快取空閒的執行緒,以至不被銷燬,如果執行緒快取中有空閒執行緒,這時候如果建立新連線,MYSQL就會很快的響應連線請求;

show status like '%thread%';
Variable_name Value
Threads_cached     0
Threads_connected   219
Threads_created     655068
Threads_running     48

使用 show status檢視當前mysql連線情況:

SHOW STATUS WHERE Variable_name LIKE '%Thread%';


Threads_cached :代表當前此時此刻執行緒快取中有多少空閒執行緒。


Threads_connected :代表當前已建立連線的數量,因為一個連線就需要一個執行緒,所以也可以看成當前被使用的執行緒數。


Threads_created :代表從最近一次服務啟動,已建立執行緒的數量。


Threads_running :代表當前啟用的(非睡眠狀態)執行緒數。並不是代表正在使用的執行緒數,有時候連線已建立,但是連線處於sleep狀態,這裡相對應的執行緒也是sleep狀態。


最好將thread_cache_size設定成與threads_connected一樣。


show variables like '%thread%';
+-----------------------------------------+-----------------+
| Variable_name                           | Value           |
+-----------------------------------------+-----------------+
| innodb_purge_threads                    | 1               |
| innodb_read_io_threads                  | 4               |
| innodb_thread_concurrency               | 0               |
| innodb_thread_sleep_delay               | 10000           |
| innodb_write_io_threads                 | 4               |
| max_delayed_threads                     | 20              |
| max_insert_delayed_threads              | 20              |
| myisam_repair_threads                   | 1               |
| performance_schema_max_thread_classes   | 50              |
| performance_schema_max_thread_instances | -1              |
| pseudo_thread_id                        | 8735851         |
| thread_cache_size                       | 128             |
| thread_concurrency                      | 24              |
| thread_handling                         | pool-of-threads |
| thread_pool_high_prio_mode              | transactions    |
| thread_pool_high_prio_tickets           | 4294967295      |
| thread_pool_idle_timeout                | 60              |
| thread_pool_max_threads                 | 100000          |
| thread_pool_oversubscribe               | 40              |
| thread_pool_size                        | 12              |
| thread_pool_stall_limit                 | 500             |
| thread_stack                            | 262144          |
| thread_statistics                       | OFF             |
+-----------------------------------------+-----------------+


可以不斷重新整理,如果Threads_cached = 0 且 Threads_created 不斷增大,那麼當前thread_cache_size的值設定要改大,改到 Threads_connected 值左右,
再結合實體記憶體 1G  —> 8;2G  —> 16; 3G  —> 32; >3G  —> 64 二個情況綜合考慮一下值,將thread_cache_size改為512;
註譯:
Threads_cached :代表當前此時此刻執行緒快取中有多少空閒執行緒。
Threads_connected :代表當前已建立連線的數量,因為一個連線就需要一個執行緒,所以也可以看成當前被使用的執行緒數。
Threads_created :代表從最近一次服務啟動,已建立執行緒的數量。
Threads_running :代表當前啟用的(非睡眠狀態)執行緒數。並不是代表正在使用的執行緒數,有時候連線已建立,但是連線處於sleep狀態,這裡相對應的執行緒也是sleep狀態。




修改thread_cache_size為512後,重新測試程式連線資料庫響應時間,速度極快,不再出現程式連線資料庫響應慢的情況!


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28939273/viewspace-2148548/,如需轉載,請註明出處,否則將追究法律責任。

相關文章