[Server] サーバー管理ツールを作る #2「CPU負荷値の取得」

2015年5月11日

サーバー プログラミング 特集

前回、複数サーバーに対してのコマンド送信、返り値の取得ができたので、それを利用して、対象サーバーの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&lt;$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分足ぐらいが現実的そうですね。