Naba Blog

プログラミングとか作曲など色々

続・Linuxサーバーで現在のCPU利用率をTweetする(平均編)

先日の記事で、Rubyを使ってLinuxサーバーで現在のCPU利用率をTweetすることが出来ました。
botを作って思ったのが、その時のCPU使用率ではなく、何時間かの平均が知りたいな―ってことで、作ってみました。

環境

naba.hatenablog.jp

上記の記事の環境が構築されている。

現在は、3時間毎にツイートするようにしているので、前の投稿から今の投稿までの平均CPU使用率をツイートするようにします。

 

1.ログを記録する

現在CPU使用率を調べるのにmpstatを使っています。

前回は、そのmpstatに対し、

mpstat 1 1 | sed -n '4,4p' | awk '{ print $13 }' | tr -d '\n'

を行うことで、現在のCPUアイドル%のみを出力することが出来ました。

この出力を、~ruby/cpu-logに保存するようにします。

このスクリプトは、~ruby/twitter-cpu-logにShellで書くことにします。

#!/bin/bash
mpstat 1 1 | sed -n '4,4p' | awk '{ print $13 }' >> ~/ruby/cpu-log

今回は、毎回改行して追記して欲しいので、tr -d '\n'は書きませんでした。

これに対して実行権限を与えます。

chmod +x ~/ruby/twitter-cpu-log

これで、

~/ruby/twtter-cpu-log

を実行すれば、~/ruby/cpu-logに現在のCPUアイドル%が書き込まれると思います。

 

2.Logに書き込まれた値から平均CPU使用率を計算する

これで、ログにCPU使用率が書き込まれました。 次は、書き込まれた数字の平均を ~/ruby/twitter-system-bot.rb内で計算してツイートできるようにします。

mpstat 1 1 | sed -n '4,4p' | awk '{ print $13 }' >> ~/ruby/cpu-log

で出てくるのは、アイドル%なので、100から引いてあげて非アイドル%を計算します。

 

今回書き換わった ~/ruby/twitter-system-bot.rb_です。

# encoding: utf-8

require 'twitter'
require 'pp'

# conputing cpu average
ave = -1.0
count = -1
max = -1.0
logfile = Dir.home + '/ruby/cpu-log'
if File.exist?(logfile) then
  ave = 0.0
  count = 0
  max = 0.0
  File.open(logfile, "r:utf-8") do |f|
    while line = f.gets
      count += 1
      tmp = 100.0 - line.to_f
      ave += tmp
      if max < tmp then
        max = tmp
      end
    end
  end
  ave = ave / count
  # delete cpu-log
  File.unlink logfile
end

# construct tweet
value = `echo "[my Server]"`
value << `date +"%Y年%m月%d日%H時%M分" | tr -d '\n'`
value << '取得,過去3時間のCPU使用率の平均は '
value << "%.2f" % ave
value << '% です(最高 '
value << max.to_s
value << `echo "% )"`

# connect Twitter
client = Twitter::REST::Client.new do |config|
  config.consumer_key = 'consumer_key'
  config.consumer_secret = 'consumer_secret'
  config.access_token = 'access_token'
  config.access_token_secret = 'access_token_secret'
end

# Tweet
client.update(value)

aveが平均を格納する変数、countが行数(合計を何で割るか)、maxが最高値を保持する変数です。

初期値が-1になっているのは、 万が一ログファイルが存在していない場合にツイートに含まれて気付くためです。

プログラムの流れは、

  1. 行数分読み込み、何行か数えつつaveに値を足しつつ、最高値を更新し続ける
  2. 全値を足したavecountで割れば平均が出てくる
  3. 読み込んだログファイルは使わないので(残っていると次の集計にも使われるので、削除する)
  4. ツイートを構成する
  5. Twitterに接続する
  6. ツイートする

という流れです。後半に関しては、前回の記事に詳しく書いてあります。

 

3.ログファイル生成をcronに登録する

最後に自動で ~/ruby/twitter-cpu-logを実行してもらうようにcronに登録しましょう。

今回は、5秒毎にログを取るように指定します。
このぐらいならサーバーに負荷はかからないかと思います。

cronでの秒数指定は以下を参考にさせていただきました。 * 秒速でcronを実行する方法 | hello-world.jp.net

crontab -e
15 0-23/3 * * * ruby /home/user/ruby/twitter-system-bot.rb
* * * * * for i in `seq 0 5 59`;do (sleep ${i} ; /home/user/ruby/twitter-cpu-log) &; done;

お疲れ様でした。

後は、cronが反映された後にtail -f ~/ruby/cpu-logなどをして、ちゃんと10秒毎にログが取れているかを確認、ツイートの確認をすれば終わりです。

4.終わり

サーバー管理をすると、何かしら形にしたいと私は思うので、今回はツイートをさせてみました。

今回はCPU情報のみですが、今後はメモリやトラフィックの情報もツイートに載せたいと思っているので、その時はまた記事にします。

 

2015/01/14追記

mpstat の挙動について、単純にmpstatのみだと上手くCPU使用率が取れないみたいです。

インターバルを指定してあげると、きちんとその時のCPU使用率を取ることが出来ます。

mpstat 1 1

これで1秒のインターバルで1回表示します。