文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


7.6.3.3 線程池操作

線程池由多個執行緒群組組成,每個群組管理一組用戶端連線。當建立連線時,線程池會以循環方式將它們指派給執行緒群組。

線程池公開可用於設定其操作的系統變數

若要設定執行緒群組的數量,請使用 thread_pool_size 系統變數。預設的群組數量為 16。關於設定此變數的指南,請參閱第 7.6.3.4 節「執行緒集區調整」

每個群組的最大執行緒數量為 4096(或在某些系統上為 4095,其中一個執行緒在內部使用)。

執行緒集區會分離連線和執行緒,因此連線與執行從這些連線接收到的陳述式的執行緒之間沒有固定的關係。這與預設的執行緒處理模型不同,預設模型將一個執行緒與一個連線關聯,使得給定的執行緒會執行來自其連線的所有陳述式。

預設情況下,執行緒集區會嘗試確保在任何時間每個群組中最多有一個執行緒在執行,但有時為了獲得最佳效能,會允許更多執行緒暫時執行。

  • 每個執行緒群組都有一個監聽執行緒,用於監聽從分配給該群組的連線傳入的陳述式。當陳述式到達時,執行緒群組會立即開始執行它,或將其排入佇列以供稍後執行。

    • 如果該陳述式是唯一收到的陳述式,並且沒有陳述式正在排隊或執行,則會立即執行。

      可以透過設定 thread_pool_transaction_delay 來延遲立即執行,這會對交易產生節流效果。如需更多資訊,請參閱以下討論中對此變數的說明。

    • 如果由於同時排隊或執行的陳述式而無法立即開始執行,則會發生排隊。

  • thread_pool_transaction_delay 變數指定交易延遲的毫秒數。工作執行緒會在執行新交易之前休眠指定的期間。

    當平行交易由於資源爭用而影響其他作業的效能時,可以使用交易延遲。例如,如果平行交易影響索引建立或線上緩衝池調整大小操作,您可以設定交易延遲,以減少這些操作執行時的資源爭用。延遲會對交易產生節流效果。

    thread_pool_transaction_delay 設定不會影響從特權連線(分配給 Admin 執行緒群組的連線)發出的查詢。這些查詢不受設定的交易延遲的影響。

  • 如果發生立即執行,則由監聽執行緒執行。(這表示該群組中暫時沒有執行緒在監聽。)如果陳述式快速完成,則執行執行緒會返回監聽陳述式。否則,執行緒集區會將陳述式視為停滯,並啟動另一個執行緒作為監聽執行緒(如有必要,則會建立它)。為了確保沒有執行緒群組因停滯的陳述式而遭到封鎖,執行緒集區會有一個背景執行緒定期監控執行緒群組狀態。

    透過使用監聽執行緒來執行可以立即開始執行的陳述式,如果陳述式快速完成,則無需建立其他執行緒。這可確保在並行執行緒數量較少的情況下,盡可能有效率地執行。

    當執行緒集區外掛程式啟動時,它會為每個群組建立一個執行緒(監聽執行緒),加上背景執行緒。如有必要,會建立其他執行緒來執行陳述式。

  • thread_pool_stall_limit 系統變數的值決定了前一個項目中 快速完成 的含義。預設的執行緒被視為停滯前的時間為 60 毫秒,但可以設定為最多 6 秒。此參數可配置,讓您可以達到適合伺服器工作負載的平衡。較短的等待時間可讓執行緒更快啟動。較短的值也更適合避免死鎖情況。較長的等待時間對於包含長時間執行陳述式的工作負載很有用,可避免在執行當前陳述式時啟動過多的新陳述式。

  • 如果 thread_pool_max_active_query_threads 為 0,則應用如上所述的預設演算法來決定每個群組的最大活動執行緒數量。預設演算法會將停滯的執行緒納入考量,並可能暫時允許更多活動執行緒。如果 thread_pool_max_active_query_threads 大於 0,則會限制每個群組的活動執行緒數量。

  • 執行緒集區的重點在於限制同時執行的短執行陳述式的數量。在執行中的陳述式達到停滯時間之前,它會阻止其他陳述式開始執行。如果陳述式執行超過停滯時間,則允許它繼續執行,但不再阻止其他陳述式開始執行。透過這種方式,執行緒集區會嘗試確保每個執行緒群組中永遠不會有一個以上的短執行陳述式,儘管可能有多個長時間執行的陳述式。不宜讓長時間執行的陳述式阻止其他陳述式執行,因為可能需要等待的時間沒有限制。例如,在複寫來源伺服器上,將二進位日誌事件傳送至複本的執行緒實際上會永久執行。

  • 如果陳述式遇到磁碟 I/O 作業或使用者層級鎖定(資料列鎖定或資料表鎖定),則陳述式會遭到封鎖。封鎖會導致執行緒群組變成未使用,因此會回呼執行緒集區,以確保執行緒集區可以立即在此群組中啟動新的執行緒來執行另一個陳述式。當遭到封鎖的執行緒返回時,執行緒集區會允許它立即重新啟動。

  • 有兩個佇列,一個高優先權佇列和一個低優先權佇列。交易中的第一個陳述式會進入低優先權佇列。如果交易正在進行(已開始執行其陳述式),則交易的任何後續陳述式都會進入高優先權佇列,否則會進入低優先權佇列。佇列指派可能會受到啟用 thread_pool_high_priority_connection 系統變數的影響,這會導致工作階段的所有排隊陳述式都進入高優先權佇列。

    如果啟用 autocommit,則非交易儲存引擎的陳述式或交易引擎的陳述式會被視為低優先權陳述式,因為在這種情況下,每個陳述式都是一個交易。因此,如果同時有 InnoDBMyISAM 資料表的陳述式,則執行緒集區會優先處理 InnoDB 的陳述式,而非 MyISAM 的陳述式,除非啟用 autocommit。啟用 autocommit 後,所有陳述式都具有低優先權。

  • 當執行緒群組選擇一個排隊的陳述式執行時,它會先在高優先權佇列中尋找,然後在低優先權佇列中尋找。如果找到陳述式,則會將其從佇列中移除並開始執行。

  • 如果陳述式在低優先權佇列中停留過久,執行緒集區會移至高優先權佇列。thread_pool_prio_kickup_timer 系統變數的值會控制移動前的時間。對於每個執行緒群組,每 10 毫秒(每秒 100 個)最多會將一個陳述式從低優先權佇列移至高優先權佇列。

  • 執行緒集區會重複使用最活躍的執行緒,以大幅提升 CPU 快取的利用率。這是一個小的調整,但對效能有很大的影響。

  • 當執行緒執行來自使用者連線的陳述式時,效能結構描述檢測會將執行緒活動歸因於使用者連線。否則,效能結構描述會將活動歸因於執行緒集區。

以下是一些執行緒群組可能會啟動多個執行緒來執行陳述式的條件範例

  • 一個執行緒開始執行陳述式,但執行時間長到被視為停滯。即使第一個執行緒仍在執行,執行緒群組也允許另一個執行緒開始執行另一個陳述式。

  • 一個執行緒開始執行陳述式,然後遭到封鎖並將此情況回報給執行緒集區。執行緒群組允許另一個執行緒開始執行另一個陳述式。

  • 一個執行緒開始執行陳述式,遭到封鎖,但未回報其已遭到封鎖,因為封鎖並未發生在已使用執行緒集區回呼檢測的程式碼中。在這種情況下,執行緒對執行緒群組而言似乎仍在執行。如果封鎖持續的時間長到足以讓陳述式被視為停滯,則群組會允許另一個執行緒開始執行另一個陳述式。

執行緒集區的設計目的是為了在連線數量增加的情況下實現可擴充性。它還旨在避免因限制主動執行陳述式的數量而可能產生的死鎖。不回報給執行緒集區的執行緒不會阻止其他陳述式執行,進而導致執行緒集區發生死鎖,這一點非常重要。以下是這類陳述式的範例

  • 長時間執行的陳述式。這會導致所有資源僅由少數幾個陳述式使用,並可能阻止所有其他陳述式存取伺服器。

  • 讀取二進位日誌並將其傳送至複本的二進位日誌傾印執行緒。這是一種長時間執行的 陳述式,它會執行很長時間,並且不應阻止其他陳述式執行。

  • 遭到資料列鎖定、資料表鎖定、睡眠或任何其他未由 MySQL 伺服器或儲存引擎回報給執行緒集區的封鎖活動所封鎖的陳述式。

在每種情況下,為了防止死鎖,當陳述式未快速完成時,會將其移至停滯類別,以便執行緒群組可以允許另一個陳述式開始執行。使用此設計,當執行緒執行或遭到封鎖的時間過長時,執行緒集區會將執行緒移至停滯類別,並且在陳述式的其餘執行期間,它不會阻止其他陳述式執行。

可能發生的最大執行緒數是 max_connectionsthread_pool_size 的總和。當所有連線都處於執行模式,並且每個群組都會建立一個額外的執行緒來監聽更多陳述式時,可能會發生這種情況。這不一定是一個經常發生的狀態,但在理論上是可能的。

特權連線

如果達到由 thread_pool_max_transactions_limit 定義的限制,並且新的連線或使用現有連線的新交易似乎會掛起,直到一個或多個現有交易完成,即使對 thread_pool_longrun_trx_limit 進行任何調整也一樣,導致所有現有連線都被封鎖或長時間執行,則存取伺服器的唯一方法可能是使用特權連線。

要建立特權連線,發起連線的使用者必須具有 TP_CONNECTION_ADMIN 權限。特權連線會忽略由 thread_pool_max_transactions_limit 定義的限制,並允許連線到伺服器以增加限制、移除限制或終止正在執行的交易。TP_CONNECTION_ADMIN 權限必須明確授予。預設情況下,不會授予任何使用者此權限。

特權連線可以執行語句和開始交易,並且會被分配到一個指定為 Admin 執行緒群組的執行緒群組。

當查詢 performance_schema.tp_thread_group_stats 表格時,該表格會報告每個執行緒群組的統計資訊,Admin 執行緒群組的統計資訊會報告在結果集的最後一列。例如,如果 SELECT * FROM performance_schema.tp_thread_group_stats 返回 17 列(每個執行緒群組一列),則 Admin 執行緒群組的統計資訊會報告在第 17 列。