ip_conntrack_maxの限界に挑む
つい先日管理しているメモリ2GBのウェブサーバーのip_contrack_maxを50万にしてみた。
# echo '500000' > /proc/sys/net/ipv4/netfilter/ip_conntrack_max
不意な事情でアクセスがバーストしてしまい、他に手もなかったのでやむなくの緊急処置として。
結果事態は無事収束。あやういところじゃった。
経過
事態が起きた当初のip_conntrack_maxはデフォルトの65535だったのだが、怒濤のごときアクセスにたちまち上限まで攻め立てられたので10万にして、それでも焼け石に水だったのでダメ元で50万にしてみたという。
ダメ元というのはip_conntrack_maxの上限値がメモリ64MBごとに4096って情報があったので無理かと思っていたため。
でもなんだか普通にいけた。
この情報はもう古いってことかな。
ちなみに15万hit/minでip_contrack_countが最大35万くらいだった。
これはtcp_fin_timeoutは10秒でtcp_tw_reuseとtpc_tw_recycleは有効にしてある状態。
tcp_fin_timeoutをデフォルトに戻してもip_contrack_maxが200万くらいあれば安心かも。
tpc_tw_recycleは副作用が出ることがあるのでそうしとこう。
そちらは困ったときの最終手段に取っておくと言うことで。
ip_conntrackを増やすことによるメモリ消費の増加
1接続につき350バイト(スワップ不可らしい)喰うので100万接続で350MBのメモリを食うことになる。
もともとメモリには余裕があったのでip_contrack_maxを200万でメモリを700MB食うことになっても問題ない。
/etc/sysctrl.conf
net.ipv4.netfilter.ip_conntrack_max = 2000000
再起動しても設定がクリアされないように書いておく。