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

2021-10-19 01:46:12 字數 2355 閱讀 4426

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...