MySQL連接處理方式及最佳並發連接數設置


MySQL連接處理方式及最佳並發連接數設置

mysql是單進程,多線程的架構,通過創建多個線程來服務不同的用戶連接,通常情況下,隨着用戶連接數的增加,mysql內部用於處理用戶連接的線程也會同步的增長,在一定范圍內,增加用戶的並發連接,對提高系統的吞吐量有一定的幫助,然而用戶並發連接數超過某個閾值,Mysql的性能反而會降低.

mysql連接處理方式

Mysql內部處理用戶連接的方式嚴格來說有三種

  1. 單線程處理所有的用戶連接,一般在調試時使用

  2. 多線程處理用戶連接,一個線程對應一個用戶連接,也是Mysql默認連接處理方式

  3. 線程池處理用戶連接,一個線程對應多個用戶連接,比如MysqlPercona發行版提供了線程池功能

 

線程緩存

Mysql默認的連接處理方式,即一個線程對應一個用戶連接,在某些場景下,有一些性能問題,比如大量的短連接,短時間內大量的連接創建和銷毀,意味着Mysql內部必須要有同樣數量的線程創建和銷毀,線程的創建,銷毀以及線程上下文切換,會帶來嚴重的性能消耗,因此Mysql開發者提出了線程緩存的概念,緩存一定數量的線程來服務用戶連接,用戶連接到來,先檢查線程緩存中有沒有可用的線程,如果沒有再去創建,如果有,直接使用線程緩存中的線程,用戶連接斷開時,線程放回線程緩存中,以便后來的用戶連接重用,減少線程頻繁創建和銷毀

代表用戶連接的數據結構THD

用戶連接在MySQL實現中由一個數據結構THD表示,THD在連接建立時被創建,在連接斷開時銷毀,用戶連接與THD的關系永遠是一對一的關系,THD不能跨連接重用,THD結構大概有10K大小,它是一個C++類,在 sql_class.h文件中定義。THD用於記錄各種執行狀態,在SQL語句執行的過程中,THD會根據實際情況申請內存使用,尤其對於復雜的SQL,THD占用的內存大小會不斷增長,平均下來,一個連接大概10M左右。

 

設置合適的連接數

MySQL能夠處理的最大連接數量由參數 max_connections 決定,但是如何設置 max_connections 的值才是最合適的呢?一般來說需要根據具體的機器配置和業務要求。通常我們需要MySQL能夠並發處理的用戶連接數越多越好,並發用戶數增加的情況下,SQL的執行響應時間不能增長太多,同時內存占用也不能太高,因此需要在並發連接數、響應時間、內存占用等方面做出平衡,並且要能滿足業務的對SQL執行的吞吐量和響應時間要求。

如何確定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

每個用戶連接在mysql中都是右一個數據結構THD表示,THD在連接建立時被創建,在連接斷開時銷毀,
用戶連接和THD是一對一的關系,THD不能跨連接重用,THD結構大約有10k左右,它是一個C++類,
THD用戶記錄各種執行狀態,在sql語句執行過程中,THD會根據實際情況申請內存使用,尤其對於復雜的sql,THD占用的內存大小會不斷增長,平均下來一個鏈接大約10M左右

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM