socketを使った、サーバっぽいアプリを作っている。
長時間動かしていると、なんか調子が悪い・・・。
メモリの使用量なんかも問題ないし、負荷が高いわけでもない。
なんとなくnetstatで見てみると、大量のFIN_WAIT2が残っていた。
なんだこれは・・・。
原因は、shutdown()だけしかしていないせいだったようだ。
close()したら、解決したようである。
い、言い訳をさせてください!
システムコールの本を読んでいて、shutdown()のところで「close()やプロセス終了でも閉じられるので、shutdown()を省略することもあります」みたいな説明が書いてあったのだ(手元に本がないので、私の記憶では、だが)。
そこを、何を勘違いしたのか「じゃあ、close()を書かずにshutdown()でもいいんだ」と解釈したのである。
冷静に考えれば、close()だけすればいいやん、と思いそうなのだが、そのときの私の心理を解説できるものはどこにもいない。。。
その前も、cURLでcurl_easy_init()とcurl_easy_cleanup()を繰り返していたら、TIME_WAITが大量に残るという現象を味わったばかりだった。
そのときは、接続先が1つしかなかったので、最初にinitしてハンドルをもらってきて、ずっと使い回すことで対応できたようだ。
サイトにも「You can do any amount of calls to curl_easy_perform while using the same easy_handle.」と書いているし、そのやり方でいいんだろうと思っている。
しかし、毎回異なるところへ接続するようだったら、また別のやり方を考えねばならんだろう。
socket関連って、原因に思い当たるノウハウがないと、なかなかつらいですな。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。