1. 程式人生 > 其它 >如何設定mysql資料庫連線池的大小

如何設定mysql資料庫連線池的大小

技術標籤:MySQL

連線池

長連線的好處這麼大,自然大家都用長連線。慢慢就搞出一套長連線維護的工具 - 資料庫連線池。

設計連線池也沒有多麼複雜,大致的步驟就是:

  1. 初始化連線;
  2. 業務取出連線;
  3. 業務傳送請求;
  4. 放回連線。

除了上面的基本功能以外,還要處理併發問題,多資料庫伺服器和多使用者,事務處理,連線池的配置與維護。大概就這些功能。有了連線池之後,連線的建立和釋放跟業務就沒有關係,交給交接池來維護。

2. MYSQL 能支援多少連線

MYSQL 的最大連線數在5.7版本中預設是151, 最大可以達到16384(2^14)。如何設定最大連線數在於你的伺服器效能,檢視 MYSQL連線數資訊命令如下:

mysql> show variables like '%max_connections%';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 5050  |
+-----------------+-------+
1 row in set (0.00 sec)

我們生產環境MYSQL的最大連線數設定為 5050,注意不能設定的太小,太小造成的後果是連線失敗:“query failed Error 1040: Too many connections“ 錯誤。太大且當連線該資料庫的機器比較多的時候則會對當前MYSQL的效能產生影響。

MYSQL官網給出了一個設定最大連線數的建議比例:

Max_used_connections / max_connections * 100% ≈ 85%

即已使用的連線數佔總上限的85%左右,如果目前已使用的連線數與最大連線數比例小於10%那很顯然設定的過大。

查詢當前資料庫已建立連線數:

mysql> show status like 'Threads_connected';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_connected | 89    |
+-------------------+-------+
1 row in set (0.00 sec)

Mysql的配置可以在全域性變數中查詢和設定,相關的配置主要可以查詢下面這些:

3. 連線池設定多少連線才合適

設定連線池的大小肯定不是越大越好,需要考慮的是當前服務所在機器的效能,網路狀況,資料庫機器效能,資料庫特性等等。同時也要做到不浪費系統資源,記憶體,埠,同步訊號量等等。

比如說應用伺服器Tomcat設定的最大執行緒池預設值200,最大假設每個執行緒會用到一個數據庫連線,那麼執行緒池大小應該小於等於200。

另外需要考慮的是,每申請一個長連線都會在物理網路上建立一個用於長連線維護的程序,而程序的執行跟物理機的CPU核數有關。理論上一個8核的伺服器將連線池設定為8最佳,每一個核同時處理一個執行緒,超過8的併發就有執行緒上下文切換的開銷。

這裡有一個 Oracle 效能小組釋出的簡短視訊,連線池測試分2個部分:

測試視訊1
https://apexapps.oracle.com/pls/apex/f?p=44785:112:11510768535381::::P112_CONTENT_ID:9565
測試視訊2
https://apexapps.oracle.com/pls/apex/f?p=44785:112:11510768535381::::P112_CONTENT_ID:9566

視訊中調整了執行緒池大小為2048的時候資料庫效能陡然下降,後面調整到144就恢復了。PostgreSQL提供了一個設定預期執行緒池大小的公式:

connections = ((core_count * 2) + effective_spindle_count)
該公式來自於: https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing。

其中,core_count是CPU核心,effective_spindle_count的含義是有效主軸數,如果你的伺服器使用的是帶有16個磁碟的RAID,那麼valid_spindle_count=16。它實質上是伺服器可以管理多少個並行I / O請求的度量。旋轉硬碟一次(通常)一次只能處理一個I / O請求,如果你有16個,則系統可以同時處理16個I / O請求。