Mysql

Azure MySQL 應用內:每個套接字地址通常只允許使用一次

  • December 20, 2019

我在 Azure 上執行一個應用服務,上面有一個 PHP 應用程序和一個 MySQL 應用內數據庫。這個應用服務有很多小請求進來(即獲取或更新遊戲的排行榜)。

通常,我會在 PHP 應用程序的日誌文件中看到以下警告:

PHP Warning:  mysqli_connect(): (HY000/2002): Only one usage of each socket address (protocol/network address/port) is normally permitted.

我收到了一些玩家抱怨他們未能在排行榜上更新他們的分數,我連接到在日誌中看到這個警告很多。我追踪到的問題是連接在作業系統級別上保持在 TIME_WAIT 狀態的時間過長,或者可以使用的埠範圍太小而無法處理更多連接。

如何在 Azure 上對此進行調整,以使此警告消失或不那麼頻繁?我在我的 mysqli 對像上使用該close()函式來清除連接,但正如我正確理解的那樣,這不會立即釋放作業系統中的底層資源。

提前致謝!

問題在於 TCP/IP 連接關閉的方式:

  • 您要求關閉連接 ( FIN),
  • 伺服器確認它收到了您的請求 ( ACK) 並要求關閉它的一側 ( FIN),
  • 您確認(ACK)並等待大約4 分鐘TIME_WAIT狀態)以確保伺服器發送並被網路延遲的數據包不會到達。在此期間您不能使用同一個埠連接到伺服器。

mysqli可能使用了幾個源埠,但即使它使用了所有源埠,限制也是每秒大約 270 個連接。

要解決您的問題,請在 PHP 中啟用持久連接並且不要關閉它們。將盡可能重用舊連接。

引用自:https://serverfault.com/questions/996341