Mysql
Azure MySQL 應用內:每個套接字地址通常只允許使用一次
我在 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 中啟用持久連接並且不要關閉它們。將盡可能重用舊連接。