為了發揮出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測試
如下是開啟線程池和不開啟線程池的效能對比。從測試結果可以看出線程池在高並發的情況下有著明顯的效能優勢。