- 締切済み
ソケットが枯渇する。ソケットの回復時間は?
プログラムとあるアプリ(プロセス)とやりとりするのにソケットを使っています。短時間に大量にこのやりとりをするとソケットが枯渇するようで「attempt to receive data on a closed socket」のようなメッセージが出ます。1度使用したソケットって時間がたつと復活するのでしょうか?復活するのなら30秒間隔ぐらいであけてゆっくりやればソケットが枯渇することもないかと思うのですがあってますでしょうか?
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- _kappe_
- ベストアンサー率68% (1601/2329)
>「クローズ済みのソケットを使って通信したよ(attempt to ~)」という主旨のメッセージが急に出るようになったのでクローズしたソケットしか存在しなくなった(使えるソケット数が上限を超えた)と判断していました。 プログラムを見てみないことには何とも言えませんが、上記の判断はよく分かりません。 ソケットプログラミングでは、ソケットを生成した後、そのソケットを使って通信し、使い終わったらそのソケットをクローズするのが通常の手順です。 「クローズ済みのソケットを使って通信しようとした」というメッセージを信じると、使い終わったと思ってクローズしたソケットを、間違って再度使おうとしたことになります。したがって、使い終わったソケットをクローズする判断を誤っている(まだクローズしてはいけないソケットをクローズした)とか、使用可能なソケットの集合の中に誤ってクローズ済みのソケットを混ぜてしまった可能性を考えると思います。 同時使用中のソケットの数が上限に達した状態でも、使用中のソケットを一つクローズすれば新たなソケットを一つ生成できるようになります。逆に言えば、クローズしない限りは新たに生成することはできないわけです。しばらく待てば勝手に復活するということはありません。 ソケットが枯渇したなら、ソケットを生成するときにエラーになるはずです。そのチェックはしているでしょうか。
- _kappe_
- ベストアンサー率68% (1601/2329)
Linuxシステムでは「1プロセスで同時に使えるファイルディスクリプタ数」が制限されています。その数を超えてソケットを使用することはできません。その上限より多くのソケットを使いたければ、limitコマンドなどを使って上限を変更する必要があります。 ただ、「attempt to receive data on a closed socket」というメッセージをそのまま読むと、ソケットが枯渇しているのではなくて、クローズ済みのソケットを使って通信したように見えます。 補足をお願いします。 1.どのようにしてソケットが枯渇していると判断したのでしょうか。 2.「短時間に大量に」とは、何個くらい(数百、数千、数万)のソケットを同時に使用したいのでしょうか。 3.使用しているプログラミング言語は何ですか。たとえばC言語であればオープンしたソケットは明示的にクローズする必要があります。
補足
ありがとうございます。 「クローズ済みのソケットを使って通信したよ(attempt to ~)」という主旨のメッセージが急に出るようになったのでクローズしたソケットしか存在しなくなった(使えるソケット数が上限を超えた)と判断していました。 「短時間に大量に」とは、数十秒間隔(1分以内の間隔)である処理を行っており1度の処理で、多く見積もって数百程度はソケットを使用していると思われます。数時間動かすと 「attempt to receive data ~」というメッセージが発生します。クローズする処理は行っております。