前回、複数サーバーに対してのコマンド送信、返り値の取得ができたので、それを利用して、対象サーバーのCPU負荷値を取得してみたいと思います。
やりたい事
topコマンドを叩いた時に表示されているCPUの負荷割合(%)の値を取得したい。
今回は2つのソースコードを記述しましたが、処理速度が早い(対象サーバーの負荷値が少ない)方を採用する事にしました。
ソースコード#1
health-cpu.sh
#!/bin/bash
DIR=`dirname $0`
dataFile=$DIR"/servers.list"
while read line
do
if [ -n "${line}" ]
then
echo ${line}"\t: `ssh -no 'ConnectTimeout 10' ${line} top -bn 1|grep Cpu|awk '{split($0,dat,":");split(dat[2],val,\",\");for(i in val){if(val[i]~\"id\"){print 100-(val[i]*1)\"%\";}}}'`";
fi
done<$dataFile
解説
1,topコマンドを-bオプションを付けることで、リアルタイム表示で戻りが無くなる状態を回避
2、CPUの書かれている行のみをgrepで抽出
3、行をawkでid(アイドル時)を取得
4、100からその値を引くと、現在の使用している割合値が取得できる
ソースコード#2
health-cpu.sh
#!/bin/bash
DIR=`dirname $0`
dataFile=$DIR"/servers.list"
while read line
do
if [ -n "${line}" ]
then
echo ${line}"\t: `ssh -no 'ConnectTimeout 10' ${line} vmstat|awk 'FNR==2{for(i=1;i<nf ;i++){if($i~\"id\"){key=i;break}}}FNR==3{print 100-$key}'`";
fi
done<$dataFile
解説
1,vmstatでcpuとla値を取得
2、メニュー部分(2行目)で「id」の文字を取得してカラム番号を取得
3、データ部分(3行目)でカラム番号の値を取得
4、100からその値を引くと、現在の使用している割合値が取得できる
使い方
1、「servers.list」ファイルに対象サーバーを改行区切りでいくつでも保存する。
2、以下のコマンドを叩くだけ(任意位置から叩いてもOK)
$ sh health-cpu.sh
192.168.33.1 : 86
192.168.33.2 : 89
192.168.33.3 : 60
192.168.33.4 : 79
192.168.33.5 : 81
192.168.33.6 : 16
※上記の値は全て「%」です。
2つのソースを比較
明らかに違ったのは速度ですね。
topコマンド自体が、情報量が多いため、1回のアクセスが目に見えて遅く感じました。
したがって#2の「vmstat」版を使うことに決定。
ちなみに、6サーバーの値取得でかかった時間はtimeコマンドでベンチしてみました。
#1:0m4.625s
#2:0m1.489s
3倍近くも性能差が出てますね。
これをcronで1分速毎に行うとすれば、240台ぐらい対象にできそうですね。
他の値取得もあるので、やはり100台で5分足ぐらいが現実的そうですね。
0 件のコメント:
コメントを投稿