mysql執行緒池

2022-08-30 08:45:09 字數 2406 閱讀 4892

mysql連線池與執行緒池

區別連線池是客戶端進行設定

執行緒池是db服務端設定

連線池的作用

控制客戶端頻繁連線db伺服器,和銷毀連線線程

執行緒池的優勢

1.防止雪崩

2.提高效能,提公升系統穩定性

架構mysql_thread_pool被劃分成乙個執行緒(timer)和多個group,每個group又有對應的工作執行緒

timer執行緒

控制管理整個group,。。。

group組成

兩個高低佇列

listener

worker

執行緒池簡化工作流程

1.客戶端的請求根據threadid%thread_pool_size來決定落到哪個group

2.group中的listener監聽到有新請求,加入佇列或者將其轉換成worker執行緒

3.group中的thread執行緒檢查佇列的請求,

有,處理,沒有,則休眠,一直沒喚醒的話,超過thread_pool_idle_timeout後,則結束執行緒退出

當然group中running執行緒數超過thread_pool_oversubscribe+1的話,也會休眠

4.timer執行緒會一直檢查group是否被阻塞,如果有,就喚醒worker執行緒或者重建

執行緒池的分配機制

執行緒池會根據thread_pool_size的值來進行group的分配,每個group各自管理客戶端發起的連線,根據threadid%thread_pool_size決定分配到哪個組?

thread_pool_oversubscribe控制每個group的併發執行緒數

相關引數 -- show variables like '%thread%'

thread_handling = pool-of-threads 啟用執行緒池

thread_pool_size = cpu cores 設定執行緒池group的數量

thread_pool_oversubscribe = 8 每個group的最大執行緒數 thread_pool_oversubscribe+1

thread_pool_high_prio_mode 高優先順序佇列控制引數,預設transactions

thread_pool_high_prio_tickets 每個連線分配來進入高優先順序佇列的ticket數,盡量設定大點。

thread_pool_idle_timeout worker執行緒最大空閒時間,預設60秒,超過限制後會退出

thread_pool_max_threads 限制執行緒池最大執行緒數,超過限制後將無法再建立更多執行緒,預設值10000. 

thread_pool_stall_limit 設定timer執行緒的檢測group是否異常的時間間隔,預設500ms

配置檔案配置 #其他引數預設即可

#thread_pool

thread_handling = pool-of-threads

thread_pool_size = 36

thread_pool_oversubscribe = 8

performance_schema =off

# extra_connection

extra_max_connections = 8

extra_port = 33333

注意事項

performance_schema=off如果performance_schema與thread_pool同時開啟的話,會有記憶體洩漏的問題,5。7.21-20已修復改問題

extra_connection防止連線池滿無法登陸

撥測異常問題

啟用執行緒池後,相當於限制了執行緒併發數,當併發連線達到mysql的最大執行緒數的時候,其他執行緒需要等待,新連線也會卡在連線驗證的那一步

這時候會造成撥測程式連線mysql超時,撥測程式連線超時後,就會認為master出現了問題,在極端情況下,重試多次都有異常後,就會

啟動自動切換操作,將業務切到從機

解決辦法

1.啟用旁路埠,監控和高可用相關直接使用mysql的旁路埠管理

2.修改高可用探測指令碼,將達到執行緒池最大活動執行緒數返回的錯誤做異常處理,當做超過最大連線數的場景來處理(只做告警,不進行自動切換)

慢sql的引入問題

因為慢sql的問題,導致group執行緒數不夠 

在沒有阻塞的時候,每次都是4個執行緒,而後面有乙個執行緒長時間執行的時候,就會出現那個長時間執行緒對應的group出現排隊的情況,

最後雖然有三個空閒的執行緒,但卻只有乙個執行緒在處理

解決辦法

1.調大thread_pool_oversubscribe

2.找到慢sql,優化

mysql 執行緒池 Mysql 執行緒池

why 在5.6以前,mysql會對每個連線建立乙個執行緒,請求結束後銷毀執行緒。在高併發的情況下,為了避免頻繁建立和釋放連線,可以通過thread cache將執行緒快取起來,請求來了先嘗試從cache中獲取,重複利用執行緒資源。問題在低併發的情況下,thread cache可以成為乙個有效的優化...

mysql 執行緒池 c MySQL執行緒池

mysql執行緒池 在麼mysql中,執行緒池指的是用來管理處理mysql客戶端連線任務的執行緒的一種機制。如果把執行緒看做系統資源那麼執行緒池本質上是對系統資源的管理,對應作業系統來說執行緒的建立和銷毀是比較消耗系統資源的,頻繁的建立與銷毀執行緒必然給系統帶來不必要的資源浪費,特別是在高負載的情況...

mysql 執行緒池測試 MySQL執行緒池測試

mysql執行緒池 thread pool 的處理 在預設的mysql的連線模型中,乙個連線對應乙個mysql伺服器的執行緒來處理連線請求 很類似於oracle的專用伺服器連線 在某些情況這種配置可能會導致一些問題,比如以下情形 1,伺服器同時太多活動連線線程,而cpu個數有限,會導致context...