簡體   English   中英

我應該如何處理mysql的“連接過多”問題?

[英]How should I handle a “too many connections” issue with mysql?

我正在工作的網絡創業公司的並發Web用戶數量從正常的5000個增加到周末的10,000個。 這個星期六的流量非常高,以至於我們開始間歇性地收到“連接過多”錯誤。 我們的CTO通過簡單地增加tatabase服務器上的max_connections值來解決此問題。 我想知道在這里使用一個持久連接是否是更好的解決方案?

即代替使用:

$db = new mysqli('db_server_ip', 'db_user', 'db_user_pass', 'db_name');

我們用:

$db = new mysqli('p:db_server_ip', 'db_user', 'db_user_pass', 'db_name');

我們已經在使用多個MySQL服務器和多個Web服務器(Apache + mod_php)。

您應該在多個Web請求之間共享數據庫連接。 在應用程序服務器上運行的每個進程都應該獲得自己的mysql連接,只要該進程正在運行,並且該連接對於進入的每個Web請求都可以重用。

PHP文檔

如果創建到SQL Server的鏈接的開銷很大,則持久連接是好的。

但是請注意,如果您使用的數據庫具有持久子連接超出的連接限制,則這可能會有一些缺點。 如果您的數據庫限制了16個並發連接,並且在服務器會話繁忙的過程中,有17個子線程嘗試連接,那么一個子線程將無法連接。

持久連接不是解決問題的方法。 您的問題是突發使用超出了數據庫配置中設置的限制,甚至超出了基礎架構中設置的限制。 您的CTO所做的,增加連接限制,是一個很好的第一步。 現在,您需要監視數據庫服務器上的資源利用率,以確保它們可以處理來自其他連接的增加的負載。 如果可以的話,那很好。 如果開始發現數據庫服務器資源不足,則需要設置其他服務器來處理流量激增。

太多聯系

原因這是錯誤引起的

  • 大量同時連接,或
  • 由於舊的連接不夠快而無法釋放

您已經執行了SHOW VARIABLES LIKE "max_connections"; 並增加了價值。

永久連接

如果使用永久或持久數據庫連接 ,則必須始終考慮MySQL指令wait_timeout 關閉不起作用,但是您可以降低超時時間。 因此,使用過的資源將再次更快地可用。 利用netstat找出完全按照此處描述的方式進行的操作https://serverfault.com/questions/355750/mysql-lowering-wait-timeout-value-to-lower-number-of-open-connections

不要忘記釋放結果集以減少數據庫服務器資源的浪費。

建議使用臨時的,短暫的連接,而不是持久連接。 在整個Web請求-響應流中,引入持久性非常重要,因為它是無狀態的。 您知道:1個pconnect請求,導致8小時持久性連接在db服務器上晃來晃去,等待下一個請求,但永遠不會到來。 用用戶數量乘以並查看您的資源。

臨時連接

如果使用mysql_connect()-不要忘記mysql_close()。 new_link設置為false並傳遞CLIENT_INTERACTIVE標志。 您可能需要調整interactive_timeout ,這有助於阻止舊的連接阻塞工作。

如果問題仍然存在,請擴展

如果問題仍然存在,則決定擴展規模。 通過添加另一台數據庫服務器並在其前面放置一個代理(MySQL與HAProxy很好地配合使用),或切換到自動擴展的雲服務。

我真的懷疑您的資料配置正確。 當您已經在運行多個MySQL服務器以及多個Web服務器時,這怎么可能是一個問題? 請描述您的負載平衡設置。

聽起來像Apache 2.2 + mod_php + MySQL +未知的平衡器,對嗎?

也許嘗試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM