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

letsspeak's diary

世界を大いに盛り上げるためのletsspeakの日記。

CentOSにGrowthForecastをいれて色々表示してみた

CentOS GrowthForecast nginx FuelPHP

最近CentOSでFuel先生とごにょごにょしているのですが、データがあまりにも大量なため基本的には静的コンテンツをタスク生成してリクエスト発生時はSELECTかmemcachedからフェッチするだけーみたいな感じで動かしていました。

そうなるとfuel/app/tasksにタスクが増える増える。crontab先生大活躍な訳なんですが、はたから見てるとちゃんと動いているのかどうかまったく分からないので、統計をとってみようとfluentdとか調べ始めたところでGrowthForecastというグラフ生成Webツールを発見して、さっそく入れてみました!

ついでに、先日の作業中0時頃にとつぜんフリーズでBrokenPipeした件も調べたいと思い、CPU使用率、メモリ使用率も集計してみることにしました。

GrowthForecastのインストール

ここが一番大変でした。
最初はこちらのgist installing_growth_forecast の通り進めたのですが、root権限でインストールしてこれで良かったのか..。と思っていた所に良い記事を発見したので下記記事を参考に進めました。

GrowthForecast を CentOS 6.3 にインストールして Supervisor で管理してみた

主にcpanmとGrowthForecastのインストールに結構時間がかかりました。

GrowthForecastのアクセス制限

動作確認後、新しいホスト名を追加してnginxでBASIC認証かけてポートを閉じます。

nginx.conf
  upstream growthforecast {
    server 127.0.0.1:5125;
  }

    server {
    listen 80;
    server_name growthforecast.yourdomain.com;

    proxy_connect_timeout 60;
    proxy_read_timeout    60;
    proxy_send_timeout    60;


    auth_basic "Secret Area";
    auth_basic_user_file "/home/growthforecast/.htpasswd";

    location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_pass http://growthforecast;
      proxy_redirect off;
    }
  }
.htpasswdの作成
htpasswd -c /home/growthforecast/.htpasswd username

CPU使用率をロギングしてみる

GrowthForecastはintegral (整数) でなければ受け付けてくれないので、小数点以下を切り捨てた値を取得するワンライナーを書いて、crontabで1分毎に報告させます。

CPU使用率(パーセント)を整数で表示する
# cpu usage (integral)
cat /proc/loadavg | cut -d ' ' -f 1 | cut -d '.' -f 1
CPU使用率をGrowthForecastに報告するcrontab
# send your cpu usage (integral) to GrowthForecast every 5 minutes via crontab
*/1 * * * * curl -F number=`cat /proc/loadavg | cut -d ' ' -f 1 | cut -d '.' -f 1` http://localhost:5125/api/yourmachine/system/cpu 2>&1

gistにも纏めておきました。
centos_cpu_usage_one_liner.sh

メモリ使用率をロギングしてみる

ワンライナーで書けさえすればGrowthForecastに報告できる!と知ってawkを調べながら書いてみました。実際の使用率については、freeコマンドの見方を参考に計算しています。

メモリ使用率(パーセント)を整数で表示する
// actual memory usage (integral)
// http://open-groove.net/linux-command/free/
free | awk 'NR==2' | awk '{print int(($3-($6+$7))/$2*100)}'

こちらもCPU使用率と同じようにnumber=``でくくってcrontabに登録すれば完了です。
メモリ使用量についてもgistに纏めておいてます。

centos_memory_usage_one_liner.sh

グラフ化結果

f:id:letsspeak:20130330222650p:plain

データを取ってみると、CPU使用率が全然低いのとメモリ使用量がおよそ70%と高めなのが気になります。
もしかすると取得方法が間違っているのかもしれないので、これから他のVPSや新しい環境構築時にログをとって比べてみたいと思います。
もし間違いなどお気づきになりましたら、ご指摘頂けると幸いです。

FuelPHPのタスクと連携

FuelPHPのタスクと連携するためにGrowthForecastにPOSTするための簡単なモデルを作成しました。

fuel/app/classes/model/growthforecast.php
<?php

Class Model_GrowthForecast extends Model
{
  static public function post($section_name = null, $graph_name = null, $number = null, $mode = 'gauge')
  {
    // validation
    if (is_null($section_name)) return;
    if (is_null($graph_name)) return;

    if (is_int($number) === false)
    {   
      if (is_numeric($number) === true)
      {   
        $number = (int)$number;
      }   
      else
      {   
        return;
      }   
    }   

    $url = 'http://localhost:5125/api/yourapplication/'.$section_name.'/'.$graph_name.PHP_EOL;
    $data = array(
      'number' => (string)$number,
      'mode' => $mode,
    );  

    $headers = array(
      "Content-Type: application/x-www-form-urlencoded",
      "Content-Length: ".strlen(http_build_query($data)),
    );  

    $options = array('http' => array(
      'method' => 'POST',
      'content' => http_build_query($data),
      'header' => implode("\r\n", $headers),
    )); 

    $contents = file_get_contents($url, false, stream_context_create($options));
  }
}

これを、こんな感じでTaskから呼び出すだけでどんどんグラフ化してくれます。

    \Model_GrowthForecast::post('crawler', 'source_count', count($sources));

f:id:letsspeak:20130330223350p:plain

やっぱり視覚化されるのは純粋に楽しい!わくわくします。

問題点など

今回ポートを閉じてしまいましたが、特定のサーバーから報告をPOSTする場合、IPアドレス指定のオプションをつけて起動して、ポート自体は開けておいたほうが良さそうです。

また今回作成したモデルではyourapplicationの部分を固定化してしまっていますが、開発環境、テスト環境、プロダクション環境に応じて値が変わるようにmodifyする必要がありそうです!