為了發揮出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測試

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