標籤:thread 資料庫連接 睡眠狀態
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)最大串連數是串連池能申請的最大串連數,如果資料庫連接請求超過此數,後面的資料庫連接請求將被加入到等待隊列中,這會影響之後的資料庫操作。
本文出自 “crazy_sir” 部落格,請務必保留此出處http://douya.blog.51cto.com/6173221/1597207
Mysql線程池系列一( thread_pool 和 connection_pool)