mysql thread入门分析
?
MySQL?thread入門分析
?
今天下午和群里的朋友討論mysql的thread pool,討論的非常熱鬧,收獲不少,借此自己也總結下thread,以備忘。下面貼上lidan的圖片:
?
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)
thread_connected等于show processlist?
thread_running代表真正在運行的(等于1一般就是這個show status命令本身)?
thread_cached代表mysql管理的線程池中還有多少可以被復用的資源?
thread_created代表新創建的thread
在5.5.16以前,線程處理的模式是,每個請求就對應一個線程的模式,這就意味著當有成千上萬的請求時,對應的也就需要成千上萬的線程來相應這些請求,那么此刻問題就很明顯了,系統的資源是有限的,必須要保證thread_number*thread_stack不能超過可以使用的內存資源,還要考慮CPU的調度能力,I/O的處理能力,這是一種很粗放的資源使用方式,同時,這種不加控制的處理方式,也會帶來資源使用的沖突,大量互斥鎖的出現,性能的急劇下降。在5.5.16以后通過Thread Pool來控制確保不會超過服務器的最大負載能力,避免出現服務無響應,導致宕機的慘狀。
?
thread pool是如何動態控制并發線程數量的?待續....
總結
以上是生活随笔為你收集整理的mysql thread入门分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入理解 python 中的赋值、引用、
- 下一篇: 数据库优化案例