1

A と呼ばれるアプリケーション サーバーと、B と呼ばれる DB サーバーがあります。

B(DB) で を実行するnetstat -ntp | grep 'A's IP' | wc -lと、400 を超える TCP 接続が表示されます。また、MySQL クライアントを使用して MySQL に接続し、実行するselect count(*) from processlist where host like 'A's IP%'と、400 を超える結果も表示されるため、MySQL と OS の両方で、A への 400 を超える接続が開いていることに同意しているようです。

ただし、A にログオンして を実行するnetstat -ntp | grep 'B's IP' | wc -lと、100 を超える TCP 接続しか表示されません。

では、これはどのように起こりますか?私はnetstat間違って使用していますか、それとも何ですか?2 つのホストが、それらの間の TCP 接続の数について意見を異にする理由がわかりません。

クイック アップデート: 実際には、A には 6 つの異なるプロジェクトがあり (一部は Rails 3.2、一部は Rails 2.3)、そのうちの 1 つが redmine です。Bの結果を取得show processlistして A と比較すると、netstat -ntpB の一致しない接続は、redmine を含むさまざまなプロジェクトからのものであることがわかりました。

PS: どちらの OS も CentOS 5.4、MySQL は Percona 5.1.57-rel12.8-log です。

PS2: すべてのサーバー/ハードウェアを再起動しましたが、問題は解決していません。突然出てきたので、問題/バグは常にそこにあると思いますが、設定した最大接続数 1000 に達するまで気付かなかったのです。それで、任意の野生の推測はありますか?アプリケーション コードのバグ (activerecord または mysql gem) でしょうか? OSのバグ?または何?

4

1 に答える 1

1

A 上のアプリケーションは、完了時に MySQL への接続を適切に閉じない可能性があります。

プロセスが A で終了すると、プロセスが所有する接続は OS によって自動的に破棄される必要がありますが、B はまだ A からのシグナルを待っています。

(MySQL) タイムアウト遅延に達すると、B は最終的にこれらの接続を解放します。

A 上のアプリケーションについて詳しく知らずに、より具体的に説明することは困難ですが、ここで驚くべきことは何もありません (A 上のアプリケーションが壊れると予想していない場合を除きます :)

于 2013-06-09T08:16:01.077 に答える