【Linux】netstatコマンドで TIME_WAIT が大量に発生する

■ はじめに

netstatコマンドで TIME_WAIT が大量に発生した時の対応案についてメモ

目次

【1】トラブル概要
【2】どんな状態?
【3】ポートの数を調べるには?
【4】対応案
 1)設定手順例
 2)補足:「net.ipv4.tcp_tw_recycle」について

【1】トラブル概要

* 負荷テストを行っている時に、netstatコマンドを入力したら、
 大量に TIME_WAIT が表示された。
 (今回は、データベースとの接続で大量に発生していた)

【2】どんな状態?

OSでは使用できるポート(「エフェメラル ポート / 動的 ポート」)の範囲が決まっている。
あまりにも、大量に TIME_WAIT が発生すると、ポートが枯渇して通信ができなくなる

# 「エフェメラル ポート / 動的 ポート」については、以下の関連記事を参照のこと。

ポート番号 / Port Number
https://dk521123.hatenablog.com/entry/2015/03/15/210000

=> netstatコマンド(オプション -o)で観察すると、
 タイマー(デフォルト60秒)が切れると、TIME_WAIT が消えていく
# 「netstatコマンド」については、以下の関連記事を参照のこと。

netstatコマンド
https://dk521123.hatenablog.com/entry/2015/04/26/204020

【3】ポートの数を調べるには?

# ip_local_post_range を参照する
cat /proc/sys/net/ipv4/ip_local_port_range
32768  60999
# 上記の場合
# 60999 - 32768 + 1 = 28232 が使用可能

# 現在のTIME_WAITの発生数をカウントする
sudo netstat -anp|grep TIME_WAIT|wc -l
2134

【4】対応案

* net.ipv4.tcp_tw_reuse / net.ipv4.tcp_fin_timeout でチューニングする

|カーネルパラメータ|説明|備考| |net.ipv4.tcp_tw_reuse|TIME_WAIT状態の接続を新しい接続で再利用するか|1:再利用。0:再利用しない| |net.ipv4.tcp_fin_timeout|FIN-WAIT-2状態を何秒保持してからTIME_WAIT状態にするか|極端に小さい(1秒)と問題が行る可能性あり。10~30秒が妥当|

1)設定手順例

[1] /etc/sysctl.conf を修正し、net.ipv4.tcp_tw_reuse / net.ipv4.tcp_fin_timeoutを設定する
sudo vi /etc/sysctl.conf
~~~~
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
~~~~

[2] sysctl -p で、カーネルパラメータを反映する

sudo sysctl -p

2)補足:「net.ipv4.tcp_tw_recycle」について

* 「net.ipv4.tcp_tw_recycle」は、いじらない方がいい
* Linux バージョン4.12から廃止

http://d.hatena.ne.jp/pullphone/20120511/1336722675
https://qiita.com/tmshn/items/b49f1b51bfc472968b30

参考文献

https://qiita.com/kuni-nakaji/items/c07004c7d9e5bb683bc2
https://rcmdnk.com/blog/2015/07/03/computer-linux/

関連記事

netstatコマンド
https://dk521123.hatenablog.com/entry/2015/04/26/204020
トランスポート層TCP / UDP
ポート番号 / Port Number
https://dk521123.hatenablog.com/entry/2015/03/15/210000
ELB に関するトラブル「HTTP 502: Bad Gateway」が表示
https://dk521123.hatenablog.com/entry/2018/01/13/212430