為了發揮出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。 說明
|
loose_thread_pool_size | 分組的數量,默認值:4。線程池中的線程被平均分到多個組中進行管理。 |
loose_thread_pool_oversubscribe | 每個組中允許的活躍線程的數量,默認值:32。活躍線程是指正在執行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測試
如下是開啟線程池和不開啟線程池的性能對比。從測試結果可以看出線程池在高并發的情況下有著明顯的性能優勢。