News&Column

大規模サイトでのPREROUTING

lvsの使い方は3種類あるのですが、そのうちの一つPREROUTING(NAT)を使っていたお客様のサーバでトラブルがありました。
以下その備忘録です。

■障害

コンテンツが閲覧できたり出来なかったりする現象が発生。dmesgを見ると

ip_conntrack: table full, dropping packet.

が出力。NATテーブルが枯れていたことがわかりました。

■現在のNATテーブルの利用量 /proc/slabinfo

slabinfo – version: 2.0
# name <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> ….
:
ip_conntrack 1089 1141 512 7 1 : tunables 54 27 8 : slabdata 163 163 0
:

■現在のNATテーブルの最大値 /proc/sys/net/ipv4/ip_conntrack_max

linuxのカーネルは、メモリ容量にあわせてこの値を自動的に増やしてくれるのですが、それは2Gまでで、2G以上搭載のマシンでは増やしてくれないようです。

1Gの場合:32744
2Gの場合:65536
4Gの場合:65536

■NATテーブルの最大値の変更方法

この最大値は、ip_contrackのhashsizeで決定されるようです。

1Gの場合:4096
2Gの場合:8192
4Gの場合:8192

今回、メモリを4G搭載のマシンでip_conntrack_maxを倍にしたかったので、

/etc/modprobe.confに
options ip_conntrack hashsize=16384
を記載して再起動。

再起動後、/proc/sys/net/ipv4/ip_conntrack_maxは倍の131072になりました。