LoginSignup
0
0

More than 5 years have passed since last update.

tcp socketを使っていて一生FIN_WAIT2が残ってしまう

Last updated at Posted at 2016-07-11

Node.jsでTCPプロキシを作っていて以下の様にFIN_WAIT2が残り続けてしまう場合に遭遇したので。
環境は CL -> PROXY(node.js) -> ELB(TCP MODE) -> SV
SVは無言で再起動かかる環境。

tcp        0      0 ip-172-31-13-220.ap-n:41594 ec2-x-x-x-161.ap-:8333 FIN_WAIT2   
tcp        0      0 ip-172-31-13-220.ap-n:33570 ec2-x-x-x-177.ap-:8333 FIN_WAIT2   
tcp        0      0 ip-172-31-13-220.ap-n:41728 ec2-x-x-x-161.ap-:8333 FIN_WAIT2   
tcp        0      0 ip-172-31-13-220.ap-n:41724 ec2-x-x-x-161.ap-:8333 FIN_WAIT2  

切断にendのみ、使っていたがそれだと問題が起きる

socket.end(); // shutdownに相当?

ドキュメント読むとNode.jsのsocket.endはBSD SOCKETのshutdownに相当するようで
この段階ではまだhalfclose状態なので相手からACKが来るのを待っている
来なければ一生待つので破棄命令を付け加える

socket.end();
socket.destroy(); // closeに相当?

※ 呼ぶタイミングはend直後で大丈夫そうだが、どのタイミングでdestroyを呼べばいいのかあとでソース読んで検討。
※ OSのtcp_fin_timeoutパラメータで対応できると思ったがうまくいかない
※ プロキシ作った理由が元のjavaのプログラムが一度DNSを引いたらそのIPアドレスを永遠に使うのでELBと相性が悪かった

Socket.destroySoon()を呼べばいいのだろうか?

node/lib/net.js
Socket.prototype.destroySoon = function() {
  if (this.writable)
    this.end();

  if (this._writableState.finished)
    this.destroy();
  else
    this.once('finish', this.destroy);
};
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0