MySQL 配置InnoDB的併發執行緒

eric0435發表於2022-04-09

配置InnoDB的併發執行緒
InnoDB使用作業系統執行緒來處理來自使用者事務的請求。(事務可能會在提交或回滾之前向InnoDB發出很多請求。)在具有多核處理器的現代作業系統和伺服器上,上下文切換非常高效,大多數工作負載不受併發執行緒數量的限制而執行良好。MySQL 5.5及以上版本的可伸縮性改進減少了InnoDB需要併發執行執行緒的數量。

線上程之間最小化上下文切換的情況下,InnoDB可以使用許多技術來限制併發執行的作業系統執行緒的數量(從而限制同一時間處理的請求的數量)。當InnoDB收到一個來自使用者會話的新請求時,如果併發執行的執行緒數在預定義的限制下,新請求會休眠一段時間,然後重試。一個在休眠後不能重新排程的請求被放入優先/優先出佇列並最終被處理。等待鎖的執行緒不計入併發執行的執行緒數。

可以透過設定配置引數innodb_thread_concurrency來限制併發執行緒的數量。一旦執行執行緒的數量達到這個限制,在被放入佇列之前,額外的執行緒將休眠數微秒,由配置引數Innodb_thread_sleep_delay設定。

以前,需要透過實驗來找到innodb_thread_sleep_delay的最佳值,而最佳值可能會根據工作負載的不同而變化。在MySQL 5.6.3及以上版本中,你可以設定innodb_adaptive_max_sleep_delay配置選項為innodb_thread_sleep_delay設定最大值,InnoDB會根據當前的執行緒排程活動自動調整innodb_thread_sleep_delay的大小。這種動態調整有助於執行緒排程機制在系統負載較輕和正常執行時順利工作。

innodb_thread_concurrency的預設值和預設的併發執行緒數限制在不同版本的MySQL和InnoDB中都有改變。innodb_thread_concurrency的預設值是0,因此預設情況下沒有併發執行執行緒的數量限制。

InnoDB只在併發執行緒數量有限的情況下才會導致執行緒休眠。當對執行緒的數量沒有限制時,所有執行緒都平等地進行排程。也就是說,如果innodb_thread_concurrency為0,則忽略innodb_thread_sleep_delay的值。

當執行緒數量有限制時(當innodb_thread_concurrency為> 0時),InnoDB透過在執行單個SQL語句時允許同時執行多個請求來減少上下文切換的開銷,而不用遵守innodb_thread_concurrency設定的限制。由於一條SQL語句(比如join)可能包含在InnoDB內的多個行操作,InnoDB會分配指定數量的tickets,允許以最小的開銷重複排程一個執行緒。

當一個新的SQL語句啟動時,執行緒沒有 tickets,它必須觀察innodb_thread_concurrency。一旦執行緒被授予進入InnoDB的許可權,它就會被分配大量的 tickets,這些 tickets可以用來隨後進入InnoDB執行行操作。如果 tickets用完,執行緒將被驅逐,並且再次觀察到innodb_thread_concurrency,這可能會將該執行緒放入等待執行緒的先入先出佇列中。當執行緒再次被授予進入InnoDB的許可權時,會再次分配 tickets。分配的 tickets數量由全域性選項innodb_concurrency_tickets指定,預設值為5000。當鎖可用時,等待鎖的執行緒將獲得一張 tickets

這些變數的正確值取決於您的環境和工作負載。嘗試一系列不同的值,以確定哪些值適合您的應用程式。在限制併發執行執行緒的數量之前,檢查一下可以提高多核和多處理器計算機上InnoDB效能的配置選項,比如innodb_adaptive_hash_index。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26015009/viewspace-2886310/,如需轉載,請註明出處,否則將追究法律責任。

相關文章