mysql thread pool

轉自:http://blog.csdn.net/wyzxg/article/details/8258033mysql

mysql 線程處理流程圖:sql

Mysql支持單線程和多線程兩種鏈接線程模式,若是單線程,則在同一時刻,只能有一個connection鏈接到Mysql,其餘的鏈接會被掛起。若是是多線程,則同一時刻能夠支持多個connection同時鏈接到服務器。mysql使用哪一種線程模式經過下面變量控制。緩存

mysql> show variables like '%thread_handling%';
+-----------------+---------------------------+
| Variable_name   | Value                     |
+-----------------+---------------------------+
| thread_handling | one-thread-per-connection |
+-----------------+---------------------------+
1 row in set (0.02 sec)服務器

客戶端發起鏈接到mysql server,mysql server監聽進程,監聽到新的請求,而後mysql爲其分配一個新的 thread,去處理此請求。從創建鏈接之開始,CPU要給它劃分必定的thread stack,而後進行用戶身份認證,創建上下文信息,最後請求完成,關閉鏈接,同時釋放資源,在高併發的狀況下,將給系統帶來巨大的壓力,不能保證性能。因此,mysql經過線程緩存來是實現線程重用,減少這部分的消耗;一個connection斷開,並不銷燬承載其的線程,而是將此線程放入線程緩衝區,並處於掛起狀態,當下一個新的Connection到來時,首先去線程緩衝區去查找是否有空閒的線程,若是有,則使用之,若是沒有則新建線程。多線程

mysql經過 thread_cache_size這參數來設置能夠重用線程的個數,他的大小能夠經過狀態變量Threads_cached和Threads_created來設置併發


mysql> show status like 'thread%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 0     |
| Threads_connected | 2     |
| Threads_created   | 1065  |
| Threads_running   | 1     |
+-------------------+-------+
4 rows in set (0.13 sec)高併發

Threads_cached:已經被線程緩存池緩存的線程個數
Threads_created:已經建立的線程個數,經過這個變化的趨勢,能夠判斷thread_cache_size參數值性能

在5.5.16之前,線程處理的模式是,每一個請求就對應一個線程的模式,這就意味着當有成千上萬的請求時,對應的也就須要成千上萬的線程來相應這些請求,那麼此刻問題就很明顯了,系統的資源是有限的,必需要保證thread_number*thread_stack不能超過可使用的內存資源,還要考慮CPU的調度能力,I/O的處理能力,這是一種很粗放的資源使用方式,同時,這種不加控制的處理方式,也會帶來資源使用的衝突,大量互斥鎖的出現,性能的急劇降低。在5.5.16之後經過Thread Pool來控制確保不會超過服務器的最大負載能力,避免出現服務無響應,致使宕機的慘狀。.net

相關文章
相關標籤/搜索