あなたの大量配信サーバ、ip_conntrack溢れていませんか?

2012年12月25日 | 八子 武司

4061611531_7429feaa25

ip_conntrackを設定する理由

パケットフィルタリングツールであるiptablesは、パケットを解析するときにip_conntrackというファイルにトラッキング情報を記録します。
ip_conntrackには、最大トラッキング数があり、それをオーバーすると新規セッションを弾いてしまって、ネットワークパフォーマンスの劣化を招きます。

/var/log/messageにこのようなメッセージが出ていたら、ip_conntrackが溢れている状態です。

ip_conntrack: table full, dropping packet

大量のトラフィックを捌くロードバランサーやキャッシュなどの目的を持ったLinuxマシンで、iptablesを使っているときには、ip_conntrackの最大トラッキング数を忘れずに設定しておきましょう。

ここでは、手元のマシンCentOS 5と6で設定をしていきます。

検証環境

CentOS 6.3(64bit)

CentOS 5.8(64bit)

ip_conntrackの設定方法

まず、現在のトラッキング数と最大トラッキング数を確認しましょう。

現在使用しているip_conntrackのトラッキング数を確認します。

CentOS 5
# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_count
24030
 
CentOS 6
# cat /proc/sys/net/netfilter/nf_conntrack_count
24030

最大トラッキング数を確認。

CentOS 5
# cat /proc/sys/net/ipv4/ip_conntrack_max
65536
 
CentOS 6
# cat /proc/sys/net/netfilter/nf_conntrack_max
net.nf_conntrack_max = 65536

カーネルパラメータに最大トラッキング数を設定してきます。

ip_conntrackは1トラッキングにつき350バイトのメモリを必要とします。
http://www.netfilter.org/documentation/FAQ/netfilter-faq-3.html

You can easily increase the number of maximal tracked connections, but be aware that each tracked connection eats about 350 bytes of non-swappable kernel memory!

これは、スワップできないメモリです。
メモリ量と相談して、余裕を持って最大トラッキング数を決めましょう。
今回は100万トラッキング(約350Mバイト必要)としました。

CentOS 5
# emacs /etc/sysctl.conf
net.ipv4.netfilter.ip_conntrack_max = 1000000
 
CentOS 6
# emacs /etc/sysctl.conf
net.nf_conntrack_max = 1000000

カーネルパラメータを反映します。
「sysctl -p」を実行すると、設定ファイルが読み込まれて値が反映されます。

CentOS 5/6
/sbin/sysctl -p

設定値を確認しましょう。

CentOS 5
# cat /proc/sys/net/ipv4/ip_conntrack_max
1000000
 
CentOS 6
# cat /proc/sys/net/netfilter/nf_conntrack_max
1000000

無事、設定が完了しました。

iptablesをリスタートしたとき、設定がリセットされないようにする

CentOS 5の場合、iptablesのバージョンが低く(iptables v1.3.5)、iptablesをリスタート、またはOSをリブートするときに最大トラッキング数がデフォルト値に戻ってしまいます。
このまま運用すると、トラフィック増大時にトラッキング数オーバーとなり、ネットワークパフォーマンスの劣化を招く結果となってしまいます。
これを、回避するようにします。

※CentOS 6(iptables v1.4.7)、Ubuntu 12(iptables v1.4.12)では同様の現象はありませんでした。

まず、iptablesをリスタートして設定が元に戻る事を確認します。

# /etc/init.d/iptables restart
Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Unloading iptables modules:                                [  OK  ]
Applying iptables firewall rules:                          [  OK  ]
Loading additional iptables modules: ip_conntrack_netbios_n[  OK  ]

設定されている最大トラッキング数を確認してみましょう。

# cat /proc/sys/net/ipv4/ip_conntrack_max
65536

リスタートしたときに「Unloading iptables modules」となり、モジュールがアンロードされて設定が戻ってしまっているのが判りますね。
これを回避するために、iptables-configで設定をnoにします。

# emacs /etc/sysconfig/iptables-config 
IPTABLES_MODULES_UNLOAD="no"

カーネルパラメータを再反映します。

# /sbin/sysctl -p
# cat /proc/sys/net/ipv4/ip_conntrack_max
1000000

iptablesをrestartします。

# /etc/init.d/iptables restart
Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Applying iptables firewall rules:                          [  OK  ]
Loading additional iptables modules: ip_conntrack_netbios_n[  OK  ]

今回は、モジュールがアンロードされていません。

# cat /proc/sys/net/ipv4/ip_conntrack_max
1000000

簡単ですね!

ip_conntrackの値をNagios/Muninで監視

最後に、ip_conntrackの数値を監視するNagios/Muninのプラグインをご紹介します。
Githubで公開されています。

Nagios
https://github.com/hrix/nagios-plugin-ip_conntrack

Munin
https://github.com/hrix/munin-plugin-ip_conntrack

これを設定しておけば、安心できますね。

e-Agencyではカーネルのチューニングが大好きなエンジニアを募集しています。

イー・エージェンシー採用について

PICK UP

お問い合わせ

サービスに関するご相談は
こちらよりお気軽にお問い合わせください。

e-Agencyの様々な情報をSNSでお届けします!