mysql thread入门分析
?
MySQL?thread入門分析
?
今天下午和群里的朋友討論mysql的thread pool,討論的非常熱鬧,收獲不少,借此自己也總結(jié)下thread,以備忘。下面貼上lidan的圖片:
?
Mysql支持單線程和多線程兩種連接線程模式,如果單線程,則在同一時刻,只能有一個connection連接到Mysql,其他的連接會被掛起。如果是多線程,則同一時刻可以支持多個connection同時連接到服務(wù)器。mysql使用哪種線程模式通過下面變量控制。
 mysql> show variables like '%thread_handling%';
 +-----------------+---------------------------+
 | Variable_name?? | Value???????????????????? |
 +-----------------+---------------------------+
 | thread_handling | one-thread-per-connection |
 +-----------------+---------------------------+
 1 row in set (0.02 sec)
客戶端發(fā)起連接到mysql server,mysql server監(jiān)聽進程,監(jiān)聽到新的請求,然后mysql為其分配一個新的 thread,去處理此請求。從建立連接之開始,CPU要給它劃分一定的thread stack,然后進行用戶身份認證,建立上下文信息,最后請求完成,關(guān)閉連接,同時釋放資源,在高并發(fā)的情況下,將給系統(tǒng)帶來巨大的壓力,不能保證性能。所以,mysql通過線程緩存來是實現(xiàn)線程重用,減小這部分的消耗;一個connection斷開,并不銷毀承載其的線程,而是將此線程放入線程緩沖區(qū),并處于掛起狀態(tài),當(dāng)下一個新的Connection到來時,首先去線程緩沖區(qū)去查找是否有空閑的線程,如果有,則使用之,如果沒有則新建線程。
mysql通過 thread_cache_size這參數(shù)來設(shè)置可以重用線程的個數(shù),他的大小可以通過狀態(tài)變量Threads_cached和Threads_created來設(shè)置
 
 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管理的線程池中還有多少可以被復(fù)用的資源?
thread_created代表新創(chuàng)建的thread
 
 
在5.5.16以前,線程處理的模式是,每個請求就對應(yīng)一個線程的模式,這就意味著當(dāng)有成千上萬的請求時,對應(yīng)的也就需要成千上萬的線程來相應(yīng)這些請求,那么此刻問題就很明顯了,系統(tǒng)的資源是有限的,必須要保證thread_number*thread_stack不能超過可以使用的內(nèi)存資源,還要考慮CPU的調(diào)度能力,I/O的處理能力,這是一種很粗放的資源使用方式,同時,這種不加控制的處理方式,也會帶來資源使用的沖突,大量互斥鎖的出現(xiàn),性能的急劇下降。在5.5.16以后通過Thread Pool來控制確保不會超過服務(wù)器的最大負載能力,避免出現(xiàn)服務(wù)無響應(yīng),導(dǎo)致宕機的慘狀。
?
thread pool是如何動態(tài)控制并發(fā)線程數(shù)量的?待續(xù)....
總結(jié)
以上是生活随笔為你收集整理的mysql thread入门分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 深入理解 python 中的赋值、引用、
- 下一篇: 数据库优化案例
