MySQL 配置InnoDB的併發執行緒
配置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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 配置InnoDB主執行緒I/O速率MySql執行緒
- MySQL 配置後臺InnoDB I/O執行緒數MySql執行緒
- MySQL:Innodb purge執行緒略解MySql執行緒
- MySQL多執行緒併發調優MySql執行緒
- MySQL:Innodb page clean 執行緒 (二) 解析MySql執行緒
- MySQL:Innodb page clean 執行緒 (一) 基礎MySql執行緒
- 66.QT-執行緒併發、QTcpServer併發、QThreadPool執行緒池QT執行緒TCPServerthread
- MySQL底層概述—3.InnoDB執行緒模型MySql執行緒模型
- Rust的併發執行緒 - ibraheemRust執行緒
- 多執行緒併發篇——如何停止執行緒執行緒
- python基礎執行緒-管理併發執行緒Python執行緒
- Java併發(四)----執行緒執行原理Java執行緒
- Java併發(一)----程式、執行緒、並行、併發Java執行緒並行
- [Java併發]執行緒的並行等待Java執行緒並行
- 併發程式設計之多執行緒執行緒安全程式設計執行緒
- 多執行緒與高併發(二)執行緒安全執行緒
- 併發與多執行緒之執行緒安全篇執行緒
- JAVA多執行緒併發Java執行緒
- Java 併發:執行緒、執行緒池和執行器全面教程Java執行緒
- Java執行緒的併發工具類Java執行緒
- java多執行緒與併發 - 執行緒池詳解Java執行緒
- Java併發實戰一:執行緒與執行緒安全Java執行緒
- 執行緒 並行 與 併發 的區別執行緒並行
- nodejs 單執行緒 高併發NodeJS執行緒
- Java併發——執行緒池ThreadPoolExecutorJava執行緒thread
- Java併發系列 — 執行緒池Java執行緒
- 聊聊併發(五)——執行緒池執行緒
- Java高併發與多執行緒(二)-----執行緒的實現方式Java執行緒
- java多執行緒與併發 - 併發工具類Java執行緒
- Java併發-執行緒安全的集合類Java執行緒
- 【python高併發】程序、執行緒的理解Python執行緒
- 五、併發控制(1):執行緒的互斥執行緒
- Java併發 之 執行緒池系列 (1) 讓多執行緒不再坑爹的執行緒池Java執行緒
- 多執行緒與高併發(一)多執行緒入門執行緒
- 【高併發】深入理解執行緒的執行順序執行緒
- 多執行緒併發執行及解決方法執行緒
- 併發工具類(三)控制併發執行緒的數量 Semphore執行緒
- Java併發程式設計之執行緒安全、執行緒通訊Java程式設計執行緒