全部產品
Search
文件中心

ApsaraDB RDS:Thread Pool

更新時間:Jun 08, 2024

為了發揮出RDS的最佳效能,阿里雲提供線程池(Thread Pool)功能,將線程和會話分離,在擁有大量會話的同時,只需要少量線程完成活躍會話的任務即可。

優勢

MySQL預設的線程使用模式是會話獨佔模式,每個會話都會建立一個獨佔的線程。當有大量的會話存在時,會導致大量的資源競爭,大量的系統線程調度和緩衝失效也會導致效能急劇下降。

阿里雲RDS的線程池實現了不同類型SQL操作的優先順序及並發控制機制,將串連數始終控制在最佳串連數附近,使RDS資料庫在高串連大並發情況下始終保持高效能。線程池的優勢如下:

  • 當大量線程並發工作時,線程池會自動調節並發的線程數量在合理的範圍內,從而避免線程調度工作過多和大量緩衝失效。
  • 大量的事務並發執行時,線程池會將語句和事務分為不同的優先順序,分別控制語句和事務的並發數量,從而減少資源競爭。
  • 線程池給予管理類的SQL語句更高的優先順序,保證這些語句優先執行。這樣在系統負載很高時,建立串連、管理、監控等操作也能夠穩定執行。
  • 線程池給予複雜查詢SQL語句相對較低的優先順序,並且有最大並發數的限制。這樣可以避免過多的複雜SQL語句將系統資源耗盡,導致整個資料庫服務不可用。

前提條件

執行個體版本為RDS MySQL 5.6/5.7/8.0。

使用Thread Pool

Thread Pool設計了如下三個參數,您可以在控制台進行修改。詳情請參見設定執行個體參數

參數說明
loose_thread_pool_enabled是否開啟線程池功能。取值:
  • ON
  • OFF

預設值:ON。

說明
  • 開啟/關閉線程池功能使用本參數即可,不再使用參數thread_handling進行控制。
  • 開啟/關閉線程池功能無需重啟執行個體。
loose_thread_pool_size分組的數量,預設值:4。線程池中的線程被平均分到多個組中進行管理。
loose_thread_pool_oversubscribe每個組中允許的活躍線程的數量,預設值:32。活躍線程是指正在執行SQL語句的線程,但是不包括以下兩種情形:
  • SQL語句在等待磁碟IO;
  • SQL語句在等待事務提交。

查詢Thread Pool狀態

您可以通過如下命令查詢Thread Pool狀態:
show status like "thread_pool%";

樣本:

mysql> show status like "thread_pool%";

+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| thread_pool_active_threads | 1     |
| thread_pool_big_threads    | 0     |
| thread_pool_dml_threads    | 0     |
| thread_pool_idle_threads   | 19    |
| thread_pool_qry_threads    | 0     |
| thread_pool_total_threads  | 20    |
| thread_pool_trx_threads    | 0     |
| thread_pool_wait_threads   | 0     |
+----------------------------+-------+
8 rows in set (0.00 sec)            

參數說明如下。

參數說明
thread_pool_active_threads線程池中的活躍線程數。
thread_pool_big_threads線程池中正在執行複雜查詢的線程數。複雜查詢包括有子查詢、彙總函式、group by、limit等的查詢語句。
thread_pool_dml_threads線程池中的在執行DML的線程數。
thread_pool_idle_threads線程池中的空閑線程數。
thread_pool_qry_threads線程池中正在執行簡單查詢的線程數。
thread_pool_total_threads線程池中的匯流排程數。
thread_pool_trx_threads線程池中正在執行事務的線程數。
thread_pool_wait_threads線程池中正在等待磁碟IO、事務提交的線程數。

Sysbench測試

如下是開啟線程池和不開啟線程池的效能對比。從測試結果可以看出線程池在高並發的情況下有著明顯的效能優勢。