読者です 読者をやめる 読者になる 読者になる

カイワレの大冒険 Third

技術的なことや他愛もないことをたまに書いてます

「ip_conntrack」を監視することのススメ

「ip_conntrack」の上限値の監視はしておかないと痛い目を見ることが多い。

中〜大規模サーバーを運用するときの勘所 – iptablesとip_conntrack | cyano見落としがちなLinuxのWEBチューニング | Act as Professionalにも書かれているように、この値は本当に監視しておいたほうがよい。特にキャッシュサーバやウェブサーバのように多くのトラフィックを扱うサーバにおいては、大事な部分である。

んで、すぐリソースモニタリングや監視ツールの対象にできればよいんだけど、そこで苦しむ人もいるだろうから、必要であれば以下のシェルをカスタマイズしてみるとよいのかもしれない。なんの値を取得しているのか知らないと監視も中途半端になるだろうし。

リモートだろうが、値を取るだけだったら、こういう風にできる。

#!/bin/sh
USER=user
KEY_DIR=/home/user/.ssh/
KEY=user@192.168.100.100  #秘密鍵指定
if [ $1 == '127.0.0.1' ] || [ $1 == 'localhost' ]; then
  cat /proc/sys/net/ipv4/netfilter/ip_conntrack_count
else
  ssh -i $KEY_DIR$KEY -q -l $USER $1 'cat /proc/sys/net/ipv4/netfilter/ip_conntrack_count'
fi

引数に監視したいIPを入れればよいだけ。

ただ、上限値を含めて、メールを飛ばしたり、味をつけるなら、こういう風にしてもよいかもしれない。

#!/bin/sh
COUNT_FILE=/proc/sys/net/ipv4/netfilter/ip_conntrack_count
COUNT=`cat $COUNT_FILE`

MAX_FILE=/proc/sys/net/ipv4/netfilter/ip_conntrack_max
MAX=`cat $MAX_FILE`

RATE=`echo $COUNT $MAX | awk '{printf ("%4.0f",$1/$2*100)}'`

if [ $RATE -ge 85 ];then
  DAY=`date +%Y/%m/%d/[%T]`
  TO_MAIL=test@example.org
  SUB=conntrack_$DAY

  cat <<EOM | mail -s "[$DAY]`hostname`: conntracks is on caution !!" $TO_MAIL
conntracks is over 85%
be careful of conntracks
EOM

fi

Bシェルでも頑張れる仕様。85%超える時期が来たら実行しただけメールが飛ぶという危険な仕様。

スクリプト組むぐらいなら、MuninなりZabbixなり監視ツールとかリソースモニタリングツールでグラフ化しておいたほうがよいと思うけど、その際に値の取得とかも使えるので、参考までに。

ちなみに、この上限まで達しているのに気づかないと、セッションが詰まり、サーバは意味不明な挙動をいくらでも示してくれます。ただ、意外にこういう部分は気づかないのが日常だったりするので、大事ですよという話しでした。

P.S.

$ cat /proc/net/ip_conntrack | wc -l

現時点での記録されたセッション数を把握するコマンドとして、このコマンドが紹介されていることもあるけど、個人的にはオススメしないかな。やってみると分かるけど、管理テーブルが常に更新されているからか、このコマンド自体が負荷となりかねない。

人柱になってもという人にしかオススメしない方法でありまする。