C/C++プログラマのためのDTrace入門

第5回 統計情報の採取

この記事を読むのに必要な時間:およそ 4 分

これまでの回でDTraceが実施するDスクリプトにおける変数は,基本的には単純な値のみを保持する,いわゆるスカラー(scalar)型のものでした。

しかし,DTraceにはスカラー型以外の変数もあります。

今回は,統計情報の採取を題材に,スカラー型以外の変数について説明したいと思います。

呼び出し頻度の採取

まずは統計情報採取の簡単な例として,特定の関数の呼び出し頻度を採取してみましょう。

集積体

DTrace での統計情報採取には,集積体(aggregation)と呼ばれる型を持つ変数を使用します。

集積体は以下の様な点で通常の変数と異なります。

  • 変数名の冒頭に必ずアットマーク("@")が付く
  • 変数名を省略可能(省略した場合は "@_" 相当とみなされます)
  • 大域変数としてしか定義できない
  • 集積体に代入できる値は(後述する)集積関数の戻り値のみ

目下の目標である「特定の関数の呼び出し頻度を採取」するDスクリプトは以下のようになります。

リスト1 呼び出し頻度の採取watch_count.d

pid$target:$1:$2:entry
{
    @total = count();
}

リスト1は,dtraceコマンドの引数として,採取対象のモジュール名(実行バイナリ名)と関数名を指定することを前提としています$1および$2と置換)⁠

それでは実際に実行してみましょう。ここでは実行例として,OpenSolaris同梱のlsコマンドにおけるformat_time()関数の呼び出し回数を採取してみます。

図1 関数呼び出し回数の採取

$ dtrace -s watch_count.d \
         -c '/usr/bin/ls -l' \
         ls format_time
dtrace: script 'watch_count.d' matched 1 probe
total 2659
        :
        :
dtrace: pid 744 has exited

               16
$

最後に表示される "16" がformat_time() 関数の呼び出し回数です。

統計結果の表示

先ほどの実行例では,dtraceコマンド終了時点で,集積体@totalの格納値が自動的に出力されました。

これは,dtrace コマンド終了におけるデフォルトの処理が,集積体の内容出力を行うようになっているためです。

しかしたとえば複数の集積体を使用している場合などに,このような形式で出力されたのでは,情報の識別が困難になってしまいます。

そこで,集積体専用の出力書式指定を行うprinta()アクションを使用して,明示的に集積体の格納値を出力してみましょう。

リスト2 統計情報出力の書式指定watch_count2.d

pid$target:$1:$2:entry
{
    @total = count();
}
END
{
    printa("total=%@u\n", @total);
}

ENDなる記述がありますが,実はこれもプローブの1つで,dtraceプロバイダによって提供されているものです。

このプローブは,Dスクリプトの実行終了の際に実施される処理を記述するためのものです。⁠Dスクリプトの実行終了」とは,以下のようなケースを指します。

  • "-c" オプション指定で実行されたプロセスが終了した場合
  • "-p" オプション指定で監視しているプロセスが終了した場合
  • "exit()" アクションで明示的に終了した場合
  • Ctrl-C等によりdtraceコマンドの実行を中断した場合

Dスクリプトの開始時点で実施する処理を記述するためのBEGINプローブもあります。

さて,肝心の集積体の表示ですが,リスト2に記述されているようにprinta()アクションで実施することができます。

printa()の機能はおおむねprintf()と同じですが,集積体値を表示するための書式指定には,通常の "%" ではなく "%@"を冒頭に持つ書式指定を使用してください。

実行例を以下に示します。

図2 集積体の書式指定

$ dtrace -s watch_count.d \
         -c '/usr/bin/ls -l' \
         ls format_time
dtrace: script 'watch_count2.d' matched 2 probes
total 2665
        :
        :
dtrace: pid 784 has exited
CPU     ID                    FUNCTION:NAME
  0      2                             :END total=16

$

著者プロフィール

藤原克則(ふじわらかつのり)

Mercurial三昧の日々が嵩じて, いつの間にやら『入門Mercurial Linux/Windows対応』を上梓。凝り性なのが災いして,年がら年中アップアップな一介の実装屋。最近は仕事の縁が元で,OpenSolarisに入れ込む毎日。

コメント

コメントの記入