mysql執行緒池(thread pool)的處理
在預設的mysql的連線模型中,乙個連線對應乙個mysql伺服器的執行緒來處理連線請求(
很類似於oracle的專用伺服器連線),在某些情況這種配置可能會導致一些問題,比如以下情形:
1,伺服器同時太多活動連線線程,而cpu個數有限,會導致context switch十分嚴重,
同時太多的程序在可執行佇列中等待,主機負載超高.對系統是乙個很大壓力;
2,當太多的活動執行緒執行innodb**時,innodb本身又會為引發擴充套件性的
問題,比如mutex爭用等.雖然用innodb_thread_concurrency雖然也可以
限制innodb活動的執行緒數,但也是有自己的爭用部分,而且不能限制同時
併發的事務數,在測試中發現即使用innodb_thread_concurrency來限制,主機的
context switch也會超高.
3,在某些時些我們想通過在伺服器上做一定的限制,讓mysql伺服器只處理一定的
請求,而讓其他的請求在等待而不至於同時在伺服器產生大量活動程序,而使伺服器
被拖死,實現類似限速的效果.
目前實現的執行緒池的主要有mysql企業版(以plugin方式實現),maridb和percona的版本.
通過定義thread_handling引數來實現連線方式的更改,預設的值為one-thread-per-connection,
表示乙個連線乙個執行緒,而值pool-of-threads(以percona的版本為例),表示使用執行緒池的方式.
當使用連線池的方式以後,伺服器建立由引數thread_pool_size定義的執行緒組個數,每個執行緒
組正常情況下對應乙個或零個活動的執行緒.預設該引數等於邏輯cpu數量.當客戶端連線請求到達時,
會以簡單隨機分配的方式分配給乙個執行緒組.
正常的情況下在乙個執行緒組中存在的執行緒叫個listener thread.當連線的語句請求到達時,這個時
候如果佇列沒有其他語句在等待時,這個listener thread會立即執行這個語句,然後返回.在一些情
況下,比如當前活動的執行緒在等待io或是鎖時,超過一定的閥值這個執行緒就會被定義成stalled,而當
另乙個連線請求到達執行緒組時,執行緒組會啟動另乙個執行緒來服務,從而避免單個執行緒執行太長時間
而使其他的連線請求在持續等待,這個引數是由thread_pool_max_threads來控制,預設是500ms.
在伺服器是4個邏輯cpu的配置中,使用sysbecn測試發起的執行緒為128時,發現context switch十分頻繁,
達到了35k-40k左右.而當使用了thread pool後,thread_pool_size設定為4,context switch的數量
僅在2k-3k左右,context switch下降非常明顯.使用了thread pool的綜合性能大約提高有5%左右.
預設的thread_pool_size等於邏輯cpu個數盡量不要去更改,對於加大這個引數沒有太多的意義,當在
4的伺服器上測試,設定為8,16等值時,帶來的只有qps下降和context switch增加.
執行緒池配置
show variables like '%handling%';
| variable_name | value |
| thread_handling | one-thread-per-connection |
mariadb執行緒池配置方法:
[mysqld]
thread_handling=pool-of-threads
oracle企業版執行緒池配置方法:
thread pool的元件和安裝:
檢視mysql己安裝的外掛程式
select * from information_schema.plugins;
show plugins
外掛程式安裝目錄:
/usr/local/mysql/lib/plugin
安裝外掛程式
[mysqld]
plugin-load=thread_pool=thread_pool.so
或[mysqld]
plugin-load=thread_pool.so
plugin-load=thread_pool=thread_pool.so;tp_thread_state=thread_pool.so;tp_thread_group_state=thread_pool.so;tp_thread_group_stats=thread_pool.so
檢視確認:
show plugins;
show variables like '%handling%';
show variables like '%thread%';
mysql 執行緒池 Mysql 執行緒池
why 在5.6以前,mysql會對每個連線建立乙個執行緒,請求結束後銷毀執行緒。在高併發的情況下,為了避免頻繁建立和釋放連線,可以通過thread cache將執行緒快取起來,請求來了先嘗試從cache中獲取,重複利用執行緒資源。問題在低併發的情況下,thread cache可以成為乙個有效的優化...
MySQL執行緒池
在傳統方式下,mysql執行緒排程方式有兩種 每個連線乙個執行緒 one thread per connection 和所有連線乙個執行緒 no threads 在實際生產中,一般用的是前者。即每當有乙個客戶端連線到mysql伺服器,mysql伺服器都會為該客戶端建立乙個單獨的執行緒。連線數越多,則...
mysql執行緒池
mysql連線池與執行緒池 區別連線池是客戶端進行設定 執行緒池是db服務端設定 連線池的作用 控制客戶端頻繁連線db伺服器,和銷毀連線線程 執行緒池的優勢 1.防止雪崩 2.提高效能,提公升系統穩定性 架構mysql thread pool被劃分成乙個執行緒 timer 和多個group,每個gr...