こんにちわ、stoneです。
話のマクラに、その時々の時事ネタとか入れたいのですが、記事の公開のタイミングはhiroshiに任せてあるので、自分ではわからないんですよねぇ。なので、今まで、マクラなしにすごく素っ気ない書き出しをしていたのですが、やっぱり気持ち悪いので、マクラを入れることにします。いやぁ、熱かったですね、クラシコ。
まさに粉砕っ!!って感じで。CLの決勝ラウンドもこの調子で勝ち上がっていってほしいものです。
さて、マクラも無理矢理いれて、すっきりしたところで(笑)、以前もhiroshiがちょっと紹介しました、zabbixを利用したmemcachedの状態監視についてもうすこし掘り下げてご紹介しようかと思います。
以下、zabbixや、memcached自体については、
・ZABBIX本家ページ
・memcached本家ページ
をごらんください。
memcachedの稼働データを取り出す
まずなによりも、memcachedから稼働状況のデータを取り出さないことには、話が進みません。以前にも書いたことがあると思いますが、新規のソフトウェアを採用する際、「稼働状況のデータが取れる」というのを選定基準の一つにしています。memcachedのソースパッケージのscriptディレクトリにmemcached-toolというプログラムがあります。DECOLOGでは、コレを利用してZABBIXに監視させています。memcachedのインストール時に同時に/usr/local/binにmemcached-toolをコピーして置くと後で面倒がなくていいです。
memcahed-toolで、こんな↓でデータがとれます。
$ memcached-tool localhost stats #localhost:11211 Field Value bytes 1869063911 bytes_read 1032067324963 bytes_written 54746662119672 cmd_get 19593630588 cmd_set 581606051 connection_structures 1995 curr_connections 131 curr_items 3809885 evictions 0 get_hits 18996360805 get_misses 597269783 limit_maxbytes 9663676416 pid 29872 pointer_size 64 rusage_system 2025915.129086 rusage_user 344758.197787 threads 1 time 1291213602 total_connections 3544421727 total_items 581606051 uptime 33891235 version 1.2.5
バージョンが古いですが、ご容赦ください。
監視項目
DECOLOGでは、memcachedサーバーの監視項目は、・ロードアベレージ
・ネットワークトラフィック
・memcachedへの接続数
・キャッシュヒット率
・ストアされているデータの中での最小のTTL
の5つを監視しています。
このうち、ロードアベレージ、ネットワークトラフィックは、ZABBIXのLinux_Templateのアイテムを利用しています。
memcachedへの接続数
上記のmemcached-toolの出力から、「curr_connections」の値をそのままZABBIXに監視させればOKです。UserParameter=memcached.curr_conn,/usr/local/bin/memcached-tool entrylistcache01 stats | grep curr_conn | awk '{print $2}'
キャッシュヒット率
こちらは、出力されるデータを元にひと手間加えます。まず、毎分、memcahed-toolsの出力をログに出力します。
/etc/zabbix/scripts/memcachedstat.sh
#! /bin/sh LOG_DIR=/var/log/memcachedstat file_name=${LOG_DIR}"/"`date +%M` /usr/local/bin/memcached-tool localhost stats > $file_nameこれを毎分起動して、1分ごとにログを残します。
/etc/cron.d/memcachedstat
* * * * * root /etc/zabbix/scripts/memcachedstat.sh
そして、ヒット率を計算するスクリプトも用意します。
/etc/zabbix/scripts/memcached_hit_ratio.sh
#! /bin/sh LOG_DIR=/var/log/memcachedstat range=$1 if [ "x"$range == "x" ]; then range=1 fi curr_file=${LOG_DIR}/`date +%M` comp_file=${LOG_DIR}/`date -d "$range min ago" +%M` if [ ! -f "$comp_file" ]; then echo -1 exit fi curr_hit=`grep get_hits $curr_file | awk '{print $2}' | sed -e 's/\r//'` curr_miss=`grep get_misses $curr_file | awk '{print $2}' | sed -e 's/\r//'` comp_hit=`grep get_hits $comp_file | awk '{print $2}' | sed -e 's/\r//'` comp_miss=`grep get_misses $comp_file | awk '{print $2}' | sed -e 's/\r//'` hit_delta=`expr $curr_hit - $comp_hit` miss_delta=`expr $curr_miss - $comp_miss` if [ $hit_delta == 0 ]; then echo -1 else echo "scale=2; 100 * $hit_delta / ($hit_delta + $miss_delta)" | bc fi
まぁ、何をやってるか日本語に直すと、
・毎分ごとのログを残す
・ログのファイル名は、起動時の分(minute)にしておく(00〜59)
・memcached_hit_ratio.shでは、現在のデータと引数で指定された分(minute)までさかのぼったデータとの比較を行う(指定がなけければ、1分前)
・取り出す値は、get_hitsとget_misses
・各々の差分から指定された時間の間のヒット率を計算
これを、ZABBIXにのせます。
UserParameter=memcache.hit_ratio[*],/etc/zabbix/scripts/memcached_hit_ratio.sh $1
ストアされているデータの最小TTL
この項目を監視しようとおもった動機なんですが、ある機能を追加しょうとデバッグを行っていたのですが、キャッシュがすぐに消えてしまう、という現象にあたりました。感覚的には、1分も持たない感じでした。で、調べた結果、やっぱり、memcached-toolが教えてくれました。「stats」を渡さないと、memcachedの中のメモリの使用状況がわかります。
$ memcached-tool localhost # Item_Size Max_age 1MB_pages Count Full? 1 104 B 33891469 s 195 1957267 no 2 136 B 33891487 s 58 439789 no 3 176 B 33891476 s 34 200526 no 4 224 B 33891486 s 35 162846 no 5 280 B 33891488 s 35 128192 no 6 352 B 33891480 s 38 112709 no 7 440 B 33891483 s 44 103514 no 8 552 B 33891475 s 54 101027 no ---- snip ----問題のキャッシュサーバーでは、こんな↓出力がありました。
# Item_Size Max_age 1MB_pages Count Full? 1 104 B 7698339 s 1 10080 yes 6 184 B 7173349 s 1 3130 no 7 208 B 39 s 3 15123 yes 8 232 B 557835 s 1924 8694555 yes 9 256 B 83 s 26 106496 yes 10 288 B 37 s 29 105560 yes 11 320 B 64 s 20 65520 yes ---- snip ----「Max_age」の欄がそのメモリブロック(slabと言うらしい)の中で、一番古いデータの保持期間らしいのですが、軒並み1分程度でキャッシュが消えてしまう、という状況になっていました。
この状況を早めに検出するために、Max_ageの値を監視することにしました。
/etc/zabbix/scripts/check_memcached_max_age
#!/usr/bin/perl my $memcached_tool = '/usr/local/bin/memcached-tool'; my $host = 'localhost'; open(IN, '-|', $memcached_tool, $host) or die "Can't start $memcached_tool: $!"; my $min = 1e100; while (ZABBIXでは、) { my @line = split; my $max_age = $line[3]; my $count = $line[6]; next unless $count > 1; $min = $max_age if $max_age < $min; } print "$min\n";
UserParameter=memcache.check_max_age,/etc/zabbix/scripts/check_memcached_max_ageとして、現状、86400秒(1日)以下だった場合に、Triggerが発動するようにしてあります。
こういう標準以外の仕込みを入れているサーバーは、他にApacheとか、MySQLとかあるんですが、それも次回以降にご紹介できればと思います。
では、また次回に♪