innodb內部的併發線程

https://www.cnblogs.com/sunss/p/3209470.htmlhtml

1. innodb_thread_concurrencymysql

innodb有一系列的計數器來統計和控制內部的工做線程。其中最重要的一個是innodb_thread_concurrency,和它相關的innodb_thread_sleep_delay 和innodb_concurrency_tickets。sql

因爲MySQL是插件式db,讀取行的時候能夠有不少方式,好比說順序讀or隨機讀,而DML(insert,delete,update)語句是要判斷是否已經進入到了innodb線程裏,若是超過了 innodb_thread_concurrency的值,首先要等innodb_thread_sleep_delay ms後嘗試再次進入工做線程,若是失敗,則會進入到FIFO隊列等待喚醒。這裏要提下爲何須要兩次嘗試?由於須要減小等待線程的個數和上下文切換的次數。併發

若是一個線程可以進到innodb層,則會發放一個innodb_concurrency_tickets 票,下次的時候若是在有效期內,則不會檢查tickets,代碼很簡單,在 srv_conc_enter_innodb function in innobase/srv/srv0srv.c裏:性能

複製代碼
if (thread->n_tickets_to_enter_innodb  > 0)
  {
    thread->n_tickets_to_enter_innodb--;
    ENTER;
  }
 
retry:
  if (entered_thread < innodb_thread_concurrency)
  {
    entered_threads++;
    thread->n_tickets_to_enter_innodb = innodb_concurrency_tickets;
    ENTER;
  }
 
  if (innodb_thread_sleep_delay  > 0)
  {
    thread_sleep(innodb_thread_sleep_delay);
  }
 
  goto retry; // (only once)
 
  WAIT_IN_FIFO_QUEUE;
  thread->n_tickets_to_enter_innodb = innodb_concurrency_tickets;
  ENTER;
複製代碼

那麼innodb_thread_concurrency最佳值是多少呢?在MySQL5.6以前建議要比cpu的核數小spa

理論上能夠設置2*(NumCPUs+NumDisks),這樣就有每一個cpu和磁盤分配2倍的active threads,可是這僅僅是理想狀況。根據實踐,通常在8核cpu推薦設置1,2,4;若是這個值遠遠比cpu個數少的話就會不能充分利用cpu,這樣線程就會在進入innodb的隊列以前sleep一段時間。插件

2. innodb_commit_concurrency線程

innodb_thread_concurrency限制行的併發度,可是在提交階段(innodb的結構和鎖爭用很嚴重的),缺沒有獲得很好的保護。MySQL從5.0就開始引進的innodb_commit_concurrency,code

Command-Line Format --innodb_commit_concurrency=#
Option-File Format innodb_commit_concurrency
System Variable Name innodb_commit_concurrency
Variable Scope Global
Dynamic Variable Yes
  Permitted Values
Type numeric
Default 0
Range 0 .. 1000

 

 

 

 

 

 

 

 

 

這個參數設置了同一時刻容許同時commit的線程數。默認是0,也便是不限制。這個值能夠在0到1000隨意設置,若是剛開始是0,要想設置>0,必須在配置文件裏添加:orm

innodb_commit_concurrency=n(n>0),在n>0的狀況下能夠設置(0~1000]的範圍變化,可是不能動態的設置成0,也不能動態的設置爲n,必須重啓MySQL;

這個值通常場景下,不限制(爲0)就能知足需求,可是0並非適用於全部的場景,對於大量寫場景,對性能提高仍是很明顯的。

 參考:http://www.mysqlperformanceblog.com/2006/06/05/innodb-thread-concurrency/  

相關文章
相關標籤/搜索