net.ipv4.tcp_tw_recycle = 1したらTIME_WAITが減った話

Hadoop環境だとOSのカーネルパラメータをいじることは一般的です。

僕の環境だとだいたいのパラーメータはすでに設定済みでマシンがくるわけなんですが、

netstat -anp | grep TIME_WAIT | wc -l

したらTIME_WAIT数がやたら多くて気になってました。ちなみfluentdでHDFSに書いてます。
なお別のfluentdが無いHadoop環境だとTIME_WAITは多く無かったです。

で設定をみたら

net.ipv4.tcp_tw_recycle = 0

だったんでこれを1にしたら良くなりましたという話なんですが、もうちょっと詳しくメモっときます。


ちなみにnet.ipv4.tcp_fin_timeoutは小さい値になってたんでそのまま。

まずこの手の設定変更をやる場合の王道として、変更前後の差異を見るためにモニタリングしたいわけです。

僕のケースだとTIME_WAITはモニタリング対象ではなかったので、モニタリングスクリプトHadoop全台に仕込んでGrowthforecastに投げるとかしないといけないわけです。普通は。

でも、ちょうどPrometheus+node_exporter+Grafanaな環境を最近作ったことを思い出しました。Prometheusのクエリを書けばTIME_WAITのモニタリングできるんじゃね?って思ってそれらしきものを探したらnode_sockstat_TCP_twがそれっぽい。これをGrafanaに登録してモニタリング準備が完了。

次はAnsibleのplaybook使ってカーネルパラメータ変更するだけです。

ネットをぐぐると/etc/sysctl.confをいじってsysctl -pしろとあるわけですが、うちの環境は/etc/sysctl.confを直接いじるのは野蛮なので/etc/security/limits.d/配下にファイル置いてsysctl -pしたんですけど反映されない。いろいろ教えてもらって、というかちゃんとman読めという話でもあるんですが、ファイルパスも違うしファイルを引数に渡さないとダメ。つまり、下記ならOK

sysctl -p /etc/sysctl.d/hadoop-limits.conf
$ man sysctl
...
       -p     Load in sysctl settings from the file(s) specified or /etc/sysctl.conf if none given.  Specifying - as filename means reading data from standard input.

       --system
              Load settings from all system configuration files.
              /run/sysctl.d/*.conf
              /etc/sysctl.d/*.conf
              /usr/local/lib/sysctl.d/*.conf
              /usr/lib/sysctl.d/*.conf
              /lib/sysctl.d/*.conf
              /etc/sysctl.conf
...


結果、このように劇的に減りました。一番多くなっている青いやつがNameNodeです。