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/