傳統 One-Thread-Per-Connection 模式下,每個客戶端連線佔用一個 OS 線程。高併發時:
線程池 將「連線」與「執行緒」解耦:固定數量的 Worker Threads 從任務隊列取任務執行,空閒連線不佔用執行緒資源。
本文基於 Percona Server 5.6.31 參數體系說明 (MariaDB/Oracle EE 大同小異)。
SET GLOBAL thread_handling = 'pool-of-threads'; -- 預設 one-thread-per-connection
| 參數 | 預設值 | 說明 | 調優建議 |
|---|---|---|---|
| thread_pool_size | CPU 核心數 | 線程組數量。每組綁定一 CPU 核心,同一時間每組僅 1 活躍線程。 | 通常等於邏輯核心數;高併發短查詢可適度增大。 |
| thread_pool_max_threads | 100000 (或 65535) | 池中最大線程總數上限。達到上限不再建立新線程。 | 防止記憶體耗盡,視記憶體大小設定 (如 4096)。 |
| thread_pool_oversubscribe | 3 | 單組允許同時活躍線程數 (超執行緒係數)。 | IO 密集型可調大 (如 10-20);CPU 密集型保持 1-3。 |
| thread_pool_stall_limit | 500 (ms) | 判定線程阻塞的時間。超過則喚醒/建立新線程處理後續任務。 | 值越大吞吐越高但延遲越大;建議 500-2000ms 折中。 |
| thread_pool_idle_timeout | 60 (秒) | 空閒線程銷毀前等待時間。 | 視連線波動調整;太短導致頻繁建銷,太長佔用記憶體。 |
| extra_port | 0 (關閉) | 額外管理埠,採 one-thread-per-connection,供緊急管理連線。 | 生產環境建議開啟 (如 3307),綁定 127.0.0.1。 |
| extra_max_connections | 1 | extra_port 最大連線數 (含 1 個 SUPER 保留)。 | 設為 10-20 供多管理員同時應急。 |
每組擁有高優先隊列與普通隊列。Worker 先處理高優先任務。
| thread_pool_high_prio_mode | 行為 |
|---|---|
| transactions (預設) | 已開啟事務 (START TRANSACTION) 且擁有 tickets 者進高優先隊列。每連線最多 thread_pool_high_prio_tickets 次 (預設 4294967295,近乎無限)。 |
| statements | 所有單獨語句均進高優先隊列。 |
| none | 禁用優先隊列,所有任務進普通隊列 (FIFO)。 |
目的: 保障短事務/語句快速提交釋放鎖資源,避免被長查詢阻塞。
雖非線程池參數,但同屬 Percona/Oracle EE 5.7 優化:半同步複制中分離 ACK 接收線程,避免 Dump Thread 串行瓶頸,間接提升主庫寫入吞吐,配合線程池效果更佳。