[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分足ぐらいが現実的そうですね。

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ