MySQL Thread pool 操作过程
生活随笔
收集整理的這篇文章主要介紹了
MySQL Thread pool 操作过程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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的緩存,這個小小的調整對性能影響很大。
????? 下面是當thread group 有多個threads 活躍時舉出的實例:
?? 1、一個線程執行一個statement,但是時間已經超過了 stalled time,thread group 會 開啟一個新的thread 來執行其他的statement,設置當第一個語句還在執行過程中。。
?? 2、一個線程正在執行一個statement,然后被 blocked并被thread pool 檢測到,這個時候此時 該 thread group 允許開啟一個新的線程來執行另一個statement。
?? 3、一個線程正在執行一個statement,然后被blocked但沒有被 thread pool檢測到,這個時候只有等到 stalled 時間 才能開啟一個新的線程來執行新的statement
????? 在某些線程 被blocked 但不被thread pool 檢測到 但也不會阻止其他語句的執行也不會造成thread pool 死鎖 這些情況是很重要的。
?? 1、長時間運行的statement,
?? 2、Binary log dump threads
?? 3、Statements blocked on a row lock, table lock, sleep, or any other blocking activity that has not been reported back to the thread pool by MySQL Server or a storage engine.
??
?? ? 以上情況,為防止死鎖的產生,該statement 都會被放到stalled 類別對待,
? ?? 最大的線程數是the sum of max_connections and thread_pool_size
本文轉自 位鵬飛 51CTO博客,原文鏈接:http://blog.51cto.com/weipengfei/1163228,如需轉載請自行聯系原作者
???? 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的緩存,這個小小的調整對性能影響很大。
????? 下面是當thread group 有多個threads 活躍時舉出的實例:
?? 1、一個線程執行一個statement,但是時間已經超過了 stalled time,thread group 會 開啟一個新的thread 來執行其他的statement,設置當第一個語句還在執行過程中。。
?? 2、一個線程正在執行一個statement,然后被 blocked并被thread pool 檢測到,這個時候此時 該 thread group 允許開啟一個新的線程來執行另一個statement。
?? 3、一個線程正在執行一個statement,然后被blocked但沒有被 thread pool檢測到,這個時候只有等到 stalled 時間 才能開啟一個新的線程來執行新的statement
????? 在某些線程 被blocked 但不被thread pool 檢測到 但也不會阻止其他語句的執行也不會造成thread pool 死鎖 這些情況是很重要的。
?? 1、長時間運行的statement,
?? 2、Binary log dump threads
?? 3、Statements blocked on a row lock, table lock, sleep, or any other blocking activity that has not been reported back to the thread pool by MySQL Server or a storage engine.
??
?? ? 以上情況,為防止死鎖的產生,該statement 都會被放到stalled 類別對待,
? ?? 最大的線程數是the sum of max_connections and thread_pool_size
本文轉自 位鵬飛 51CTO博客,原文鏈接:http://blog.51cto.com/weipengfei/1163228,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的MySQL Thread pool 操作过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在word文档中怎么添加下划线
- 下一篇: string与QString转换(str