為了發揮出PolarDB MySQL版的最佳效能,PolarDB提供線程池(Thread Pool)功能,將線程和會話分離,在擁有大量會話的同時,只需要少量線程完成活躍會話的任務即可。
優勢
MySQL預設的線程使用模式是會話獨佔模式,每個會話都會建立一個獨佔的線程。當有大量的會話存在時,會出現大量的資源競爭導致效能下降。同時大量的系統線程調度和緩衝失效也會導致效能急劇下降。
PolarDB的線程池實現了不同類型SQL操作的優先順序及並發控制機制,將串連數始終控制在最佳串連數附近,使PolarDB資料庫在高串連大並發情況下始終保持高效能。線程池的優勢如下:
當大量線程並發工作時,線程池會自動調節並發的線程數量在合理的範圍內,從而避免線程調度工作過多和大量緩衝失效。
大量的事務並發執行時,線程池會將語句和事務分為不同的優先順序,分別控制語句和事務的並發數量,從而減少資源競爭。
線程池給予管理類的SQL語句更高的優先順序,保證這些語句優先執行。這樣在系統負載很高時,建立串連、管理、監控等操作也能夠穩定執行。
線程池給予複雜查詢SQL語句相對較低的優先順序,並且有最大並發數的限制。這樣可以避免過多的複雜SQL語句將系統資源耗盡,導致整個資料庫服務不可用。
使用Thread Pool
Thread Pool設計了以下參數,您可以在控制台進行修改。具體請參見設定叢集參數和節點參數。
參數名稱 | 說明 |
loose_thread_pool_enabled | 是否開啟線程池功能。取值:
預設值:OFF。 說明 開啟或關閉線程池功能無需重啟執行個體。 |
loose_thread_pool_size | 線程池中線程組的數量。取值範圍與叢集中主節點規格的CPU核心數有關。 取值:DBNodeClassCPU~DBNodeClassCPU*10。 預設值:DBNodeClassCPU*2。 說明
舉例如下:
|
loose_thread_pool_high_prio_mode | 線程池高優先順序隊列模式。取值:
預設值:transactions。 說明 僅PolarDB MySQL版5.6和5.7版本支援該參數。 |
loose_thread_pool_high_prio_tickets | 高優先順序隊列的單次門票數。 取值:0~4294967295。 預設值:4294967295。 說明 僅PolarDB MySQL版5.6和5.7版本支援該參數。 |
loose_thread_pool_idle_timeout | 釋放線程池空閑線程的時間閾值,超過此時間,沒有服務任何請求的空閑線程將被釋放。 取值:0~31536000。 預設值:60。 單位:秒。 說明 僅PolarDB MySQL版5.6和5.7版本支援該參數。 |
loose_thread_pool_oversubscribe | 每個線程組中允許的活躍線程的數量。 活躍線程是指正在執行SQL語句的線程,但是不包括以下兩種情形:
取值:1~1000。 預設值:10。 |
loose_thread_pool_stall_limit | 判斷線程池進入擁塞狀態的時間閾值。 當線程池進入擁塞狀態時,系統會建立新的線程來服務SQL。 取值:1~18446744073709551615。 預設值:5。 單位:毫秒。 說明 資料庫引擎MySQL 5.6版本預設值為30毫秒。 |
loose_bypass_thread_pool_ips | 配置不受線程池限制的用戶端IP地址。即便線程池被佔滿時,也可以執行SQL來進行一些管理操作。 配置樣本:
說明 僅PolarDB MySQL版8.0.1.1.19及之後版本支援該參數。 |
loose_bypass_thread_pool_check_ignore_proxy | 通過
預設值:ON。 說明 僅PolarDB MySQL版8.0.1.1.19及之後版本支援該參數。 |
loose_thread_pool_high_priority_users | 配置高優先順序別的資料庫帳號。配置後這些帳號的請求將會被放到線程池的高優先順序隊列中,優先進行處理。 配置樣本:
說明
|
loose_thread_pool_mark_ddl_thread_timeout_sec | 配置DDL的線程池逾時時間閾值。超過此時間後,將DDL標記為逾時狀態,系統會建立新的線程來處理請求。 取值:0~864000。 預設值:600。 單位:秒。 說明 僅PolarDB MySQL版8.0.1.1.19及之後版本支援該參數。 |
loose_thread_pool_mark_ddl_thread_timeout_immediately | 線上程池處於高負載狀態,造成低優先順序隊列發生堆積時,是否立刻將DDL標記為逾時狀態,此時系統會建立新的線程來處理請求。該參數適用於需要經常批量DDL的業務情境中。取值:
預設值:OFF。 說明 僅PolarDB MySQL版8.0.1.1.19及之後版本支援該參數。 |
查詢Thread Pool狀態
您可以通過如下命令查詢Thread Pool狀態:
select * from information_schema.THREAD_POOL_STATUS;
返回樣本如下所示。
mysql> select * from information_schema.THREAD_POOL_STATUS;
+----+--------------+---------------------+----------------------+-------------------+---------------------------+------------------+-----------------+------------------+
| ID | THREAD_COUNT | ACTIVE_THREAD_COUNT | WAITING_THREAD_COUNT | DUMP_THREAD_COUNT | SLOW_THREAD_TIMEOUT_COUNT | CONNECTION_COUNT | LOW_QUEUE_COUNT | HIGH_QUEUE_COUNT |
+----+--------------+---------------------+----------------------+-------------------+---------------------------+------------------+-----------------+------------------+
| 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 5 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 6 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 7 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 8 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 9 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 10 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 11 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 12 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 13 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 14 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 15 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 16 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 17 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 18 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 19 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 20 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 21 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 22 | 2 | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
| 23 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 24 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 25 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 26 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 27 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 28 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 29 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 30 | 2 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
| 31 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 32 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 33 | 2 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
| 34 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 35 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 36 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 37 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 38 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 39 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 40 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 41 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 42 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 43 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 44 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 45 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 46 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 47 | 3 | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
| 48 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 49 | 3 | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
| 50 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 51 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 52 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 53 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 54 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 55 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 56 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 57 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 58 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 59 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 60 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 61 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 62 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 63 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+----+--------------+---------------------+----------------------+-------------------+---------------------------+------------------+-----------------+------------------+
64 rows in set (0.00 sec)
參數說明如下。
參數 | 說明 |
ID | 線程池ID。 |
THREAD_COUNT | 線程池中的線程數。 |
ACTIVE_THREAD_COUNT | 線程池中的活躍線程數。 |
WAITING_THREAD_COUNT | 線程池中正在等待磁碟I/O、事務提交的線程數。 |
DUMP_THREAD_COUNT | 線程池中DUMP類長串連數量。 |
SLOW_THREAD_TIMEOUT_COUNT | 線程池中被標記逾時的線程數。 |
CONNECTION_COUNT | 線程池中已建立的使用者串連數。 |
LOW_QUEUE_COUNT | 線程池中低優先順序隊列中等待的請求數。 |
HIGH_QUEUE_COUNT | 線程池中高優先順序隊列中等待的請求數。 |
Sysbench測試
如下是開啟線程池和不開啟線程池的效能對比。從測試結果可以看出線程池在高並發的情況下有著明顯的效能優勢。