net.ipv4.tcp_tw_reuse
自分がクライアント側として開いたTIME_WAITとなっているソケットが安全に使い回せる条件を満たした場合に再利用するオプション。
具体的な条件としては以下のような感じだそう。
sourceaddr, destinationaddr, port, interface がすべて一致し、自分でタイムスタンプを付与した場合で、クライアント側(サーバ側ではない)で、TIME_WAITが2秒以上経過した場合に、そのポートを再利用できる。
by https://www.rarul.com/mt/log/2018/01/time-wait.html
理屈としてはこんな感じっぽい。
TCP timestampを使用すると、TIME_WAIT状態のソケットに通信が行われた最後の時間(timestamp)を記録できます。
TW_REUSEオプションを有効にした状態で、クライアントソケットを作成すると、TIME_WAIT状態のソケットのうち、現在のtimestampよりも確実に小さい値のtimestampを持つソケットは再利用(reuse)ができます。一般的に、Linuxではtimestampの単位は秒なので、TIME_WAIT状態に遷移してから1秒後のソケットは再利用できるようになります。
net.ipv4.tcp_timestampsが有効になっていないと使えないうえに、相手方もTPC timestampが有効化されている必要がある。
注意することは、TW_REUSEオプションは、通信を行う双方でTCP timestampオプションが設定されていると有効になるということです。どちらか一方でもTCP timestampオプションが有効になっていなければ、TIME_WAIT状態のソケットを再利用することはできません。
ISUCONにおいてはnginxなどでロードバランシングする際に、TIME_WAITで溢れて問題になった場合にnet.ipv4.tcp_timestampsと共に有効化するとスコアを伸ばせるかも。
デフォルトでは0(無効)、有効化するには1を設定する。
refs. https://meetup-jp.toast.com/1516
#カーネルパラメータ