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

俺の報告

RoomClipを運営するエンジニアの日報(多分)です。

日報 #15 - ピザとる?

長い夜だった。 玉置浩二がいなかったら死んでたよ俺。

さて、昨日のことはちょっと忘れて、日報いこうか。
今日のテーマは「CPU過負荷について」

http://study.next-engine.net/linux%E9%AB%98%E8%B2%A0%E8%8D%B7%E3%81%AE%E5%8E%9F%E5%9B%A0%E3%82%92%E8%AA%BF%E6%9F%BB.html

よく読んで終了。ありがてぇありがてぇ。
以上終了なんだが、一応俺がここ2,3日で継続的にやってるCloudWatchを使ったサーバ監視についてまとめる。
取得対象としたのは下記一覧。

  • ApacheCount : apacheプロセスの起動数
  • CPU/IDLE : CPUのIDLE割合
  • CPU/SYSTEM : システムが実行しているプロセスの割合
  • CPU/USER : ユーザが実行しているプロセスの割合
  • CPU/WAITE : プロセス待ちの割合
  • LoadAverage : ロードアベレージ(1min)
  • MemoryAvailable : 残りメモリバイト
  • MemoryUsed : 使用メモリバイト
  • MemoryUtilization : 使用メモリ百分率

この内、メモリに関するものは、一昨日触れた

http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/DeveloperGuide/mon-scripts-perl.html

ここで手に入るperlスクリプトmod-put-instance-data.plでなんとかなる。
LAやCPU周りの数値は、当初CloudWatch CLI ( https://aws.amazon.com/developertools/2534 )から飛ばしていたが、これはjavaを使用するため、シングルコアのEC2で複数項目を1分毎にcronしたりすると中々厳しい。
ということで、mod-put-instance-data.plで何とかする。

まず、該当のApacheCountやCPU周りの数値を吐き出すシェルを作成する。

hoge.sh

#!/bin/bash 

# LoadAvg
CPU_LOAD_AVERAGE=`uptime | sed -e "s/load/|/" | sed -e "s/,//g" | cut -d'|' -f2 | cut -d':' -f2`
CPU_AVR_1min=`echo "$CPU_LOAD_AVERAGE" | cut -d' ' -f2`
CPU_AVR_5min=`echo "$CPU_LOAD_AVERAGE" | cut -d' ' -f3`
CPU_AVR_15min=`echo "$CPU_LOAD_AVERAGE" | cut -d' ' -f4`
 
# VMSTAT cpu state
VMST=`vmstat | sed -n '3,3p'`
VMST_US=`echo $VMST | awk 'NR == 1 {print $13}'`
VMST_SY=`echo $VMST | awk 'NR == 1 {print $14}'`
VMST_ID=`echo $VMST | awk 'NR == 1 {print $15}'`
VMST_WA=`echo $VMST | awk 'NR == 1 {print $16}'`
 
# Apache count
APACHE_COUNT=`ps -ef | grep apache -c`
 
# ALL DATA OUT PUT
echo -e "$CPU_AVR_1min,$APACHE_COUNT,$VMST_US,$VMST_SY,$VMST_ID,$VMST_WA"

そして、それをmod-put-instance-data.plに食わせる。

俺の場合、適当に400行目くらいにある、

add_metric('MemoryAvailable', $mem_units, $mem_avail / $mem_unit_div);

を参考に、
ただ並べる。

my $custom_metrix_value= `/home/ubuntu/cw/aws-scripts-mon/custom_metrix_value.sh`;
my @custom_metrix_values= split(/,/, $custom_metrix_value); # LA,APC,US,SY,ID,WA
add_metric('LoadAverage', 'Count', $custom_metrix_values[0]);
add_metric('ApacheCount', 'Count', $custom_metrix_values[1]);
add_metric('CPU/USER', 'Percent', $custom_metrix_values[2]);
add_metric('CPU/SYSTEM', 'Percent', $custom_metrix_values[3]);
add_metric('CPU/IDLE', 'Percent', $custom_metrix_values[4]);
add_metric('CPU/WAITE', 'Percent', $custom_metrix_values[5]); 

強引だけど。コレのほうがmon-put-dataで送信するよりずっと軽く処理できる。
ということで、俺はこれを今ずーーーーっと眺めている。
ちなみにEC2のI/Oも監視している。
iotop ( http://guichaz.free.fr/iotop/ )をたまに動かしながら。
ピークタイムが過ぎるのを待っている。
まるで間抜けだ。
だが不安だからずーーーーーーっと見ている。
ずーーーーっと。
お腹が空いた。

ピザとる?