innodb_thread_concurrency引數的建議配置

chenfeng發表於2017-06-28
innodb_thread_concurrency:
INNODB儲存引擎中允許的最大的執行緒併發數。
InnoDB使用作業系統執行緒來處理使用者事務請求,它是這樣工作的:當InnoDB收到一個使用者的請求時,如果已經超過innodb_thread_concurrency預先設定的併發執行緒數量,那麼就會按照innodb_thread_sleep_delay預先設定的值休眠N秒,之後再次嘗試連線,重試兩次的機制是為了減少CPU上下文切換的次數,以降低CPU消耗。如果請求被接受了,則會獲得一個innodb_concurrency_tickets預設500次的通行證,在這些次數用完之前,該執行緒重新請求時無須再進行前面所說的innodb_thread_concurrency的檢查。如果還沒有被接受,那麼就會進入佇列中,直到最終被處理掉。

該值建議設定如下:
當併發使用者執行緒數量小於64,建議設定innodb_thread_concurrency=0;
如果負載不穩定,時而低,時而高到峰值,建議先設定innodb_thread_concurrency=128,並透過不斷的降低這個引數,96, 80, 64等等,直到發現能夠提供最佳效能的執行緒數,例如,假設系統通常有40到50個使用者,但定期的數量增加至60,70,甚至200。你會發現,效能在80個併發使用者設定時表現穩定,如果高於這個數,效能反而下降。在這種情況下,建議設定innodb_thread_concurrency引數為80,以避免影響效能;
如果DB伺服器上還允許其他應用,需要限制mysql的執行緒使用情況,則可以設定可分配給DB的執行緒數,但是不建議DB上跑其他應用,也不建議這麼設定,因為這樣可能導致資料庫沒有對硬體最優使用;
設定過高值,可能會因為系統資源內部爭奪導致效能下降;
在大多數情況下,最佳的值是小於並接近虛擬CPU的個數;
定期監控和分析DB,因為隨著資料庫負載的變化,業務的增加,innodb_thread_concurrency也需要動態的調整。
如果一個工作負載中,併發使用者執行緒的數量小於64,建議設定innodb_thread_concurrency=0;



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

相關文章