web-dev-qa-db-ja.com

Azure MySQLアプリ内:通常、各ソケットアドレスの使用は1つだけ許可されます

PHPアプリケーションとMySQLアプリ内データベースを使用してAzureでアプリサービスを実行しています。このアプリサービスには、大量の小さな要求(つまり、取得または更新)が入っていますゲームのリーダーボード)。

多くの場合、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()関数を使用して接続をクリアしますが、私が正しく理解しているように、これはOSの基になるリソースをすぐに解放しません。

前もって感謝します!

2
Jan Discart

問題は、TCP/IP接続を閉じる方法にあります。

  • 接続を閉じるように要求します(FIN)、
  • サーバーはリクエストを受信したことを確認し(ACK)、サイドを閉じるように要求します(FIN)、
  • あなたはそれを認めて(ACK)、周りを待つ4分TIME_WAIT状態)。サーバーによって送信され、ネットワークによって遅延されたパケットが到着しないことを確認します。この間、同じポートを使用してサーバーに接続することはできません。

mysqliはおそらく複数のソースポートを使用しますが、それらすべてを使用したとしても、制限は1秒あたり約270接続です。

問題を解決するには、 永続的な接続 を有効にしてPHPで閉じないでください。古い接続は可能な限り再利用されます。

2