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

再起動しても設定がクリアされないように書いておく。

参考

次の記事

CentOSでgitosis