conntrackコマンド

非常に忙しいサーバやNATやプロクシサーバなどを運用している環境だと上記のようなエラーによく遭遇するかと思います。

iptablesを利用している環境では利用するステートフルなパケットのエントリを管理するためのテーブルが必要で、
管理するエントリが多すぎるとエントリテーブルのサイズが上限に達してしまい上記のエラーとともにパケットをドロップしましたよというエラーが表示されるようになります。
※iptablesが動作していない環境では問題とはなりません。

この問題を解決するためにはエントリのテーブルサイズの上限を引き上げる必要があります。

みなさんと同じように我々も下記のように設定しています。
※CentOS6系

vi /etc/sysctl.conf
net.nf_conntrack_max = 1000000

そして、

当然、「この値は監視しなくてはならない」となると思います。

dmmではmuninのip_conntrackというプラグインを利用してこの値を監視することになるのですが、

どうもネットワーク系のエラーが多発して調子が悪い。

muninのグラフを見てみるとインターフェースで多くのエラーが発生してしまいます。

if_err2_vnet1-day

if_err2_eth1-day (2)

調査していくとこのプラグインはスクリプトの中で

上記のコマンドを呼び出しているようです。
このプロセスが動作している時だけロードアベレージが跳ね上がるので、
root権限でのコマンドのせいで競合が発生しこの値の取得に多くの時間を要しているのかもしれません。
※混雑する時間帯は15秒もかかる場合も。

あまり混雑していない15時くらいの時間でも下記のように多くの時間を要していました。

sudo time cat /proc/net/ip_conntrack|wc -l

24028

real 0m2.616s
user 0m0.005s
sys 0m2.621s

因果関係はわかっていませんがこの状況のためエラーが高くなっているのではないかと推測。

該当するプラグインを停止してみました。
その時の画像が下記の3枚となります。※先ほどと同じではあるのですが。
12時すぎに該当のmuninプラグインを停止したのですが、その後エラーが発生していないことが分かるかと思います。

if_err2_eth1-day (2)

if_err2_vnet1-day

また、下記はロードアベレージの値ですが、muninが動作する5分毎にギザギザになっていたものが、
なめらかになったのがわかるかと思います。

load-day

自分でプラグインを作ればなんとかなるかなとプラグインのソースを眺めていると

my $conntrack = '/usr/sbin/conntrack';
my $nf_conntrack_file = '/proc/net/nf_conntrack';
my $ip_conntrack_file = '/proc/net/ip_conntrack';
my $command;
if ( -x $conntrack) {
$command = "$conntrack -L -o extended 2&>/dev/null";
} elsif ( -r $nf_conntrack_file ) {
$command = "cat $nf_conntrack_file";
} elsif (-r $ip_conntrack_file ) {
$command = "cat $ip_conntrack_file";
} else {
die "Can't find conntrack information\n";
}

という部分がありました。

まずはconntrackというコマンドが実効可能かどうかを確認し可能であればそのコマンドを使うようになっています。

/usr/sbin/conntrackコマンド???

はい、知らなかったです。調べてみました。

conntrackコマンドはconntrack-toolsに含まれているコマンドでredhat系の標準レポジトリでは含まれていません。

我々の環境でもconntrackコマンドが入っていないため、当然catコマンドが呼び出される状態だった。

リッチな機能を搭載したユーザ空間で動作するコマンドで/proc/net/nf_conntrackを置き換えるべく作られたようなので、
兎にも角にも、早速、インストールして違いを確認してみました。

インストール方法

wget http://sourceforge.net/projects/flexbox/files/flexbox-release-1-1.noarch.rpm/download
rpm -ivh flexbox-release-1-1.noarch.rpm
yum -y install conntrack-tools

コマンド結果

$ sudo time cat /proc/net/ip_conntrack|wc -l
27311

real 0m3.324s
user 0m0.002s
sys 0m3.322s

$ time conntrack -L|wc -l
conntrack v0.9.15 (conntrack-tools): 27062 flow entries have been shown.
27062

real 0m0.142s
user 0m0.101s
sys 0m0.047s

15時30分の時間帯でもかなりの差がついています。

なるほど、
だから、conntrackコマンドがあれば優先して利用し、なるべくcatを利用しないような設計になっているんだと。

とりあえずは自分でプラグインを作成する必要はなさそうで、

今後は高負荷なサーバでconntrackテーブルを監視する場合はconntrackコマンドをインストールしようかなと思っています。

追記です。

23時30分時点でのコマンド結果

$ time conntrack -L|wc -l
conntrack v0.9.15 (conntrack-tools): 53225 flow entries have been shown.
53225<
real 0m0.265s
user 0m0.191s
sys 0m0.087s

ユーザ空間で動作するコマンドなのでユーザで利用時間が多くなっています。

$ sudo time cat /proc/net/ip_conntrack|wc -l
51947

real 0m14.574s
user 0m0.009s
sys 0m14.611s

こちらのroot権限で動作するcatコマンドはシステムの利用時間が多くなっています。

こんなに違うんですね。

linux

Posted by Akira


PAGE TOP