mysql 執行緒池 Mysql 執行緒池

2021-10-25 14:24:53 字數 1643 閱讀 6811

why

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

問題在低併發的情況下,thread_cache可以成為乙個有效的優化機制,但在併發突然增加時,會產生非常嚴重的問題。比如thead_cache_size是512,突然來了3000個連線怎麼辦?

mysql在5.6之前,會硬著頭皮建立3000個執行緒!如果是一台一般配置的機器,比如32核、128g這種看起來還不錯的配置,會因為執行緒上下文切換,導致整個例項無法及時響應問題,即使按主鍵查詢,也可能超過1s,因此dba可能建議你:控制連線數在300左右。

通過客戶端使用連線池技術,是可以控制總的連線個數,超過連線池最大值,客戶端直接拒絕響應。但隨著機器的擴大,在微服務還未完全的系統中,多個應用連乙個庫並非不可能,再諸如乙個mysql例項多庫的情況,更上雪上加霜。

通過在5.5版本上的遭遇,在3.5k的connections和threads情況下,mysql所在機器的cpu、memory不是效能陡然下降的原因,此時cpu有可能利用率很低,因為時間都花在了切換執行緒上下文上了,作業系統的資源也包括執行緒資源。

當然可以設定 max_connections,在連線過多時,拒絕信的連線請求

解決乙個執行緒可以處理多個連線

連線被thread group管理起來,group的數量和cpu核心數相當,每個group最少有乙個連線,達到最大程度利用cpu的效果,按連線的性質進行重要性排序和queued

適用場景

threads_running變數持續較高,如innodb引擎中,總是超過40

如果你在使用innodb_thread_concurrency來限制同時執行語句的數量,他們解決了相同的問題

主要是短查詢時

較多的事務導致的資源競爭,導致獲取鎖的時間消耗變大,thread pool將減少這樣的競爭

經驗值thread_pool_size :執行緒組數量,預設16,建議16-36,最好是24-36,值的範圍1-64,否則報錯(執行緒組數量與cpu相當,每個執行緒組中有workerthread,listenthread)

thread_pool_stall_limit:將乙個sql打標成stall的時間的閾值,意思為這個sql占用了較長的時間,該讓個其它人了,較低的值允許執行緒更快的啟動起來;避免死鎖。較高的值適合於長時間執行的語句,避免當前語句執行時有太多其他語句執行

每乙個group有多個worker執行緒,乙個worker執行緒可以處理多個連線的sql,可以按優先順序進行佇列排序,比如預設的按事務排序

show global variables like 『%thread_handling%『;

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

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

mysql 執行緒池 c MySQL執行緒池

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

MySQL執行緒池

在傳統方式下,mysql執行緒排程方式有兩種 每個連線乙個執行緒 one thread per connection 和所有連線乙個執行緒 no threads 在實際生產中,一般用的是前者。即每當有乙個客戶端連線到mysql伺服器,mysql伺服器都會為該客戶端建立乙個單獨的執行緒。連線數越多,則...