mysql是單進程,多線程的架構,通過創建多個線程來服務不同的用戶連接,通常情況下,隨着用戶連接數的增加,mysql內部用於處理用戶連接的線程也會同步的增長,在一定范圍內,增加用戶的並發連接,對提高系統的吞吐量有一定的幫助,然而用戶並發連接數超過某個閾值,Mysql的性能反而會降低.
Mysql內部處理用戶連接的方式嚴格來說有三種
-
-
多線程處理用戶連接,一個線程對應一個用戶連接,也是Mysql默認連接處理方式
-
線程池處理用戶連接,一個線程對應多個用戶連接,比如MysqlPercona發行版提供了線程池功能
如何確定MySQL的最大負載和最大並發度?通過壓測,不斷增加客戶端並發數。比如起始客戶端並發數為2,依次遞增到4,8,16,32等等,每次遞增,在沒有達到性能瓶頸前,壓測的TPS會隨着客戶端並發數的增加而增大,響應時間通常會隨着客戶端並發數的增加而增加,但是增加的幅度並不明顯。當客戶端並發數達到某個閾值時,比如128,或者256甚至更大時,TPS不再增長,反而出現下降,響應時間則會出現跳躍式的增長,此時則可以認為MySQL已經達到了當前配置的最大性能。不同的硬件配置下,MySQL最大性能的並發連接數也不相同,需要根據具體的環境測試,一般的原則是最大並發連接數等於CPU邏輯核心數的4倍。
此外,如果業務對響應時間有一定的要求,比如業務要求響應時間50ms,在低於50ms的響應時間之內,TPS越高越好。這時就需要通過壓測來確定最合適的並發連接數,在響應時間不超過50ms的前提下,不斷提高並發數,獲取最佳性能。然而不同的機器配置,不同的業務類型,可能會有不同的結果。
下圖展示了某個測試環境下,MySQL最佳性能的並發數,在並發128之前,隨着並發數的增加,TPS也相應增加,響應時間平穩,然而超過128,可以看到TPS出現下降,並且響應時間增加明顯。
簡化理解
有三種連接方式 1.單線程模式,處理所有的用戶連接 2.多線程處理,一個線程對應一個用戶(mysql默認的方式) 3.線程池處理用戶連接,一個線程池對應多個用戶連接
每個用戶連接在mysql中都是右一個數據結構THD表示,THD在連接建立時被創建,在連接斷開時銷毀,
用戶連接和THD是一對一的關系,THD不能跨連接重用,THD結構大約有10k左右,它是一個C++類,
THD用戶記錄各種執行狀態,在sql語句執行過程中,THD會根據實際情況申請內存使用,尤其對於復雜的sql,THD占用的內存大小會不斷增長,平均下來一個鏈接大約10M左右