[pgsql-jp: 38495] Re: 切断後もTCPコネクションが残り続ける
take @ ics.co.jp
take @ ics.co.jp
2007年 6月 15日 (金) 10:52:45 JST
さいとうです。
At Thu, 14 Jun 2007 18:01:03 +0900,
=?ISO-2022-JP?B?GyRCNVxOUxsoQiAbJEI9JDBsGyhC?= wrote:
>
> お世話になります。
> 宮林と申します。
>
> Windows用インストーラでバージョン8.2.3をWindowsXPにインストールして運用しているのですが、
> TCP/IP経由で接続しようとすると成功も失敗もせず、ただずっと待ち続けるという現象が発生しました。
>
> そこで調査のためサーバパソコンでnetstatを実行してみると、
> 大量のCLOSE_WAIT状態の接続が残っていました。
> この接続はPostgreSQLを再起動するまでずっと残っていました。
>
> Proto Local Address Foreign Address State
> TCP 127.0.0.1:5432 127.0.0.1:3523 CLOSE_WAIT
> TCP 127.0.0.1:5432 127.0.0.1:3524 CLOSE_WAIT
> TCP 127.0.0.1:5432 127.0.0.1:3525 CLOSE_WAIT
> ・
> ・
> ・
>
> アプリケーションが原因かと思い、試しにpsqlで接続、切断を行ってみると、
> クライアント側では、FIN_WAIT_2、サーバ側ではCLOSE_WAITの接続が、
> psql終了後も残り続けました。
> (FIN_WAIT_2はしばらくすると消えましたが、CLOSE_WAITは残り続けました。)
>
> 私の環境ではCLOSE_WAIT状態の接続が3000を超えたあたりから同様の現象が発生するようです。
> アプリケーションを修正して、接続と切断の回数を減らすことは可能ですが、
> それでも長期間運用すると同様の現象が発生するのではないかと不安です。
>
> 原因や対処法をご存知の方がおられましたら、ご教授願います。
まったくはずしているかもしれませんが。
とある別のMLで
OSがWIndowsXP、プログラムはJava、java.net.Socketを使っている、
new Socket(), Socket#close()をを繰り返すとエラーが発生する。
以下のようなプログラムを作ってためしたところ、3-4000回繰り返したあたり
でエラーが発生します。
import java.net.Socket;
public class SocketTest {
public static void main(String[] args) throws Exception {
for ( int i=0; i<100000; i++ ) {
Socket soc = new Socket("hoge", 12345);
if ( ( i % 100 ) == 0 ) {
System.out.printf("count : %d socket:%d / %s\n", i, soc.hashCode(), soc);
System.gc();
}
Thread.sleep(2);
soc.close();
}
}
}
>> java SocketTest
...
Exception in thread "main" java.net.BindException: Address already in use: connect
ちなみに同じものをLinuxで動かしても全然平気です。
JavaとWindowsとSocketと、その辺りの組合せの問題なのかもしれないけれど、
というはなしもありながら、最終的にはThreadとSocketの初期化のタイミング
の問題を見直すことで正常に動作するようになったようです。
# 上記の例はThreadを使ってませんので、あまり参考にはならないかも
PostgreSQLがJavaで書かれている、とは思っていませんが、同じようなことが
原因となっているのかもしれませんね。
PostgreSQLへの接続切断回数を減らすと対応できそうだ、ということであれば
pgpoolなどが選択肢のひとつにならないでしょうか。
# ん? pgpoolってWindowsで動くのかな?
--
Zzz... ....................................................
Zzz... さいとう たけし
Zzz... ....................................................
pgsql-jp メーリングリストの案内