Thread pool 操作過程:
thread pool 包含一定數量的 thread groups,每個groups 管理一定量的client connections,當mysql建立 connection 時,thread pool會以迴圈的方式(round-robin fashion)將其分配到其中的一個 thread groups中。
thread_pool_size 規定了thread groups 的數量,這樣也就規定了同時可以執行多少個statement 可取值為 1—64,每個thread group 的最大線程數是4096.
thread pool 將 connection 和threads 分隔開,所以connection 和thread 和沒有固定的聯絡。
演算法:
每個 thread group 有一個監聽線程,該線程監聽那些從connection 發送過濾的statement,當接受到a statement 的時候,thread group 會有兩個選擇;立即執行或者放入隊列稍後執行。
當接受到的只是一個語句,而且沒有其他語句處於隊列,或者當前沒有語句正在執行,那麼就會立即執行該語句,否則的話該語句就會放入到隊列中。
當立即執行該語句時,那監控線程就會來執行次任務,此時意味著在該thread group 中臨時沒有線程處於監聽狀態,如果該語句執行的很快,那麼該線程還會返回來繼續處於監聽狀態。否則的話,thread pool 就會在需要的時候建立一個新的線程來監聽。 thread pool 有一個後台線程來周期的監控thread group的狀態,以免因為執行SQL時thread group 被block(比如遇到disk io 產生中斷等)
thread_pool_stall_limit 參數取值範圍60ms ---- 6s,該值代表了該語句將要結束並且要執行下一個語句的時間間隔(線程在超過thread_pool_size時,會等待thread_pool_stall_limit ms後建立新線程,防止線程池瞬間擴充而還來不必要的線程開銷)。較小的值 允許新的線程快速的啟動,這樣也可以防止死結的產生。對於那些長時間執行的statement,適合較大的值,這樣防止同時執行太多的statement。
thread pool 專註於並發的短時間啟動並執行statement ???
當statement遇到disk io時,或者row lock或者table lock的時候,會造成 thread group 變的不可用,此時 thread pool 有一個回調機制來讓該group 內開啟一個新的thread 來執行其他的statement,當blocked thread 返回的時候,thread pool立馬使用。
對於隊列: high-priority queue 和 low-priority queue
一般情況下,事務裡的第一個statement會被放到 低層級的隊列中,其他的語句會被放到較進階別的。 thread_pool_high_priority_connection 可以將所有statement 都放到 進階別的隊列中。
如果語句針對的是非事務型的儲存引擎,或者儲存引擎 autocommit=1 所有的語句都會被放入到 low 層級的隊列中,
當thread group 選擇隊列中的語句開始執行的時候,先檢查高優先順序的隊列,然後是低優先順序的隊列,對於發現的語句,它會從隊列中移除並開始執行。
如果某個語句在低優先順序的隊列中時間太長,thread pool 會將其放入到高優先順序的隊列中,thread_pool_prio_kickup_timer 參數來控制這個時間。
thread pool 會選擇重用最活躍的threads 來充分利用CPU的緩衝,這個小小的調整對效能影響很大。