■ はじめに
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