Mysql線程池系列一( thread_pool 和 connection_pool)

 

                              thread_pool 和 connection_pool

              當客戶端請求的數據量比較大的時候,使用線程池可以節約大量的系統資源,使得更多的CPU時間和內存可以高效地利用起來。而數據庫連接池的使用則將大大提高程序運行效率,同時,我們可以通過其自身的管理機制來監視數據庫連接的數量、使用情況等。本文我們主要就介紹一下線程池和數據庫連接池的原理,接下來我們一起來了解一下這一部分內容。


首先介紹什麼是mysql thread pool,幹什麼用的?
使用線程池主要可以達到以下兩個目的:
1、在大併發的時候,性能不會因爲過載而迅速下降。
2、減少性能抖動

thread pool的原理:

其實線程池的原理很簡單,類似於操作系統中的緩衝區的概念,它的流程如下:先啓動若干數量的線程,並讓這些線程都處於睡眠狀態,當客戶端有一個新請求時,就會喚醒線程池中的某一個睡眠線程,讓它來處理客戶端的這個請求,當處理完這個請求後,線程又處於睡眠狀態。可能你也許會問:爲什麼要搞得這麼麻煩,如果每當客戶端有新的請求時,我就創建一個新的線程不就完了?這也許是個不錯的方法,因爲它能使得你編寫代碼相對容易一些,但你卻忽略了一個重要的問題?那就是性能!就拿我所在的單位來說,我的單位是一個省級數據大集中的銀行網絡中心,高峯期每秒的客戶端請求併發數超過100,如果爲每個客戶端請求創建一個新線程的話,那耗費的CPU時間和內存將是驚人的,如果採用一個擁有200個線程的線程池,那將會節約大量的系統資源,使得更多的CPU時間和內存用來處理實際的商業應用,而不是頻繁的線程創建與銷燬。

thread pool包含數個thread groups,每個thread group管理一組客戶端連接。當連接建立以後,thread pool以輪詢的方式分配他們到thread group.
thread group的數量是通過thread_pool_size配置得到的,默認是16個,最大64個,最小1個。
每個thread group最大可以有4096個線程。

thread pool到底能夠提升多少性能?
根據Oracle Mysql官方的性能測試
在並發達到128個連接以後.沒有線程池的Mysql性能會迅速降低。使用線程池以後,性能不會出現波動,會一直保持在較好的狀態運行。
在讀寫模式下,128個連接以後,有線程池的Mysql比沒有線程池的Mysql性能高出60倍。
在只讀模式下,512個連接以後,有線程池的Mysql比沒有線程池的Mysql性能高出18倍。

什麼時候可以考慮使用thread_pool?
* show global status like ‘%threads_running%’;的值是mysql server當前併發執行語句的數量軌跡,如果這個值一直保持在40左右的區間,那麼可以考慮使用thread pool。
*如果你使用了innodb_thread_concurrency參數來控制併發的事物量,那麼使用線程池將會獲得更好的效果。
*如果你的工作是有很多短連接組成的,那麼使用線程池是有益的。

線程池解決的幾個問題:? 

*高併發的多線程棧導致CPU的緩存幾乎失效,線程池促進線程堆棧重用,減少CPU緩存量。
*太多的線程併發執行,上下文切換開銷很高,這對操作系統的任務調度是一個很大的挑戰,線程池可以把mysql活躍的併發線程控制在一個適合mysql server運行的水平。
*太多的事務併發執行會增加資源爭用,在innodb引擎裏,會增加獲取central mutexes的時間,線程池可以控制事務的併發量。

mysql thread pool和 client端的connection pool的不同之處?
client段的connection pool:連接池主要用來管理客戶端的連接,避免重複的連接/斷開操作,而是將空閒的連接緩存起來,可以複用。從而減少了連接mysql server/斷開mysql server的開銷與成本,從而提升性能。
但是mysql的connection pool不能獲取mysql server的查詢處理能力以及當前的負載情況。
thread pool:線程池的操作是在mysql server端,並且設計就是用來管理當前併發的連接和查詢.

connection pool  :在client 端

thread pool         :在mysql server 端


connection pool 的原理:

數據庫連接是一種關鍵的有限的昂貴的資源,這一點在多用戶的網頁應用程序中體現得尤爲突出。

一個數據庫連接對象均對應一個物理數據庫連接,每次操作都打開一個物理連接,使用完都關閉連接,這樣造成系統的性能低下。 數據庫連接池的解決方案是在應用程序啓動時建立足夠的數據庫連接,並講這些連接組成一個連接池(簡單說:在一個“池”裏放了好多半成品的數據庫聯接對象),由應用程序動態地對池中的連接進行申請、使用和釋放。對於多於連接池中連接數的併發請求,應該在請求隊列中排隊等待。並且應用程序可以根據池中連接的使用率,動態增加或減少池中的連接數。

連接池技術儘可能多地重用了消耗內存地資源,大大節省了內存,提高了服務器地服務效率,能夠支持更多的客戶服務。通過使用連接池,將大大提高程序運行效率,同時,我們可以通過其自身的管理機制來監視數據庫連接的數量、使用情況等。

1)最小連接數是連接池一直保持的數據庫連接,所以如果應用程序對數據庫連接的使用量不大,將會有大量的數據庫連接資源被浪費;

2)最大連接數是連接池能申請的最大連接數,如果數據庫連接請求超過此數,後面的數據庫連接請求將被加入到等待隊列中,這會影響之後的數據庫操作。

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章