0

サーバーのイノクテット、アウトオクテット、およびカウンターを追跡するために、PHP を使用して RRD グラフを作成しようとしています。

これまでのところ、スクリプトは期待どおりに動作していますが、2 つ以上の個別のグラフを作成しようとすると問題が発生します。(毎時、毎週など) グラフを作成しようとしています。RRA を数時間と数日に分割したため、ループを作成することで問題が解決すると考えました。残念ながら、期待どおりに同時に更新されるが同じことをプロットする2つのグラフができてしまいます。同様の問題に遭遇した人はいますか?私は RRD::Simple を使用して perl で同じプログラムを適用しました。非常に簡単で、すべてがほぼ自動的に調整されます。

グラフ出力

コードが少し長いため、可能な限り最小限のデータをコードの実例の下に示しました。

<?php

$file = "snmp-2";
$rrdFile = dirname(__FILE__) . "/snmp-2.rrd";
$in = "ifInOctets";
$out = "ifOutOctets";
$count = "sysUpTime";
$step = 5;
$rounds = 1;
$output = array("Hourly","Daily");

while (1) { 
  sleep (6);

  $options = array(
           "--start","now -15s", // Now -10 seconds (default)
           "--step", "".$step."",
           "DS:".$in.":GAUGE:10:U:U",
           "DS:".$out.":GAUGE:10:U:U",
           "DS:".$count.":ABSOLUTE:10:0:4294967295",
           "RRA:MIN:0.5:12:60",
           "RRA:MAX:0.5:12:60",
           "RRA:LAST:0.5:12:60",
           "RRA:AVERAGE:0.5:12:60",
           "RRA:MIN:0.5:300:60",
           "RRA:MAX:0.5:300:60",
           "RRA:LAST:0.5:300:60",
           "RRA:AVERAGE:0.5:300:60",
           );


  if ( !isset( $create ) ) {

    $create = rrd_create(
             "".$rrdFile."",
             $options
             );

    if ( $create === FALSE ) {
      echo "Creation error: ".rrd_error()."\n";
    }
  }

  $t = time();

  $ifInOctets = rand(0, 4294967295);
  $ifOutOctets = rand(0, 4294967295);
  $sysUpTime = rand(0, 4294967295);

  $update = rrd_update(
               "".$rrdFile."",
               array(
                 "".$t.":".$ifInOctets.":".$ifOutOctets.":".$sysUpTime.""
                 )
               );

  if ($update === FALSE) {
    echo "Update error: ".rrd_error()."\n";
  }

  $start = $t - ($step * $rounds);

  foreach ($output as $test) {   

    $final = array(
           "--start","".$start." -15s",
           "--end", "".$t."",
           "--step","".$step."",
           "--title=".$file." RRD::Graph",
           "--vertical-label=Byte(s)/sec",
           "--right-axis-label=latency(min.)",
           "--alt-y-grid", "--rigid",
           "--width", "800", "--height", "500", 
           "--lower-limit=0",
           "--alt-autoscale-max",
           "--no-gridfit",
           "--slope-mode",
           "DEF:".$in."_def=".$file.".rrd:".$in.":AVERAGE",
           "DEF:".$out."_def=".$file.".rrd:".$out.":AVERAGE",
           "DEF:".$count."_def=".$file.".rrd:".$count.":AVERAGE",
           "CDEF:inbytes=".$in."_def,8,/",
           "CDEF:outbytes=".$out."_def,8,/",
           "CDEF:counter=".$count."_def,8,/",
           "COMMENT:\\n",
           "LINE2:".$in."_def#FF0000:".$in."",
           "COMMENT:\\n",
           "LINE2:".$out."_def#0000FF:".$out."",
           "COMMENT:\\n",
           "LINE2:".$count."_def#FFFF00:".$count."",
           );

    $outputPngFile = rrd_graph(
                   "".$test.".png",
                   $final
                   );

    if ($outputPngFile === FALSE) {
      echo "<b>Graph error: </b>".rrd_error()."\n";
    }

  } /* End of foreach function */

  $debug = rrd_lastupdate (
               "".$rrdFile.""
               );

  if ($debug === FALSE) {
    echo "<b>Graph result error: </b>".rrd_error()."\n";
   } 

  var_dump ($debug);

  $rounds++;

} /* End of while loop */

?>
4

1 に答える 1

1

いくつかの問題。

まず、RRD の定義には、5 秒のステップと、12x5s=1min および 300x5s=25min のステップの RRA があります。また、長さはわずか 60 行なので、それぞれ 1 時間と 25 時間になります。この方法では、週ごとのグラフを取得することはできません! さらに行を追加する必要があります。また、ステップはかなり短いように見えます。時間ごとのグラフには小さなステップの RRA が必要で、週ごとのグラフには大きなステップの RRA が必要になる場合があります。

第二に、グラフ関数をどのように呼び出しているかが明確ではありません。あなたは指定しているようです:

"--start","".$start." -15s",
"--end", "".$t."",
"--step","".$step."",

...これにより、5 秒間隔 (使用できないため、1 分間隔が常に使用されます) を使用し、グラフは「毎時」または「あなたが求めていたように。

定義した RRA は、求めるグラフの時間ウィンドウを定義しないことに注意してください。また、複数の RRA が定義されているからといって、別の引数でグラフ関数を 2 回呼び出さない限り、複数のグラフが得られるわけではありません。

日ごとのグラフが必要な場合は、

"--start","end - 1 hour",
"--end",$t,

とにかく最も適切な使用可能なものが使用されるため、ステップを指定しないでください。日次グラフの場合は、

"--start","end - 1 day"
"--end",$t,

同様に、ステップを指定する必要はありません。

うまくいけば、これで少しわかりやすくなります。ほとんどの RRD グラフ オプションには適切なデフォルトがあり、RRDTool は、グラフ サイズ、時間ウィンドウ、および DEF ステートメントに基づいて、使用する正しい RRA を選択するのに非常に優れています。

于 2014-05-11T09:25:38.170 に答える