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です。