DTraceを使ってみよう#1(入門編) : やっぱり Sun がスキ! やっぱり Sun がスキ!

やっぱり Sun がスキ!

http://blogs.sun.com/yappri/date/20060529 2006年 5月 29日 月曜日

DTraceを使ってみよう#1(入門編)


■DTrace を使ってみよう。

Solaris 10 から DTrace 機能が搭載されました。
DTrace とはシステムに関連した問題(特に性能)をリアルタイムで分析する機能です。
この強力な機能を上手に活用すれば、問題を早期解決することができます。
従来は原因を特定するために、膨大な時間を必要としていました。
(adb, truss などのツールを駆使していました。)
■特徴
・リアルタイムに分析、診断できるポイントを約4万箇所持っています。
・D言語というスクリプト言語で制御します。
■使ってみよう
何はともあれ動かしてみましょう。

まずはスクリプトを記述します。

# cat test.d
syscall::write:entry
/uid==0/
{
	printf("%s",execname);
}

profile:::tick-1sec
/i++>=10/
{
	exit(0);
}
このスクリプトをDTraceで実行してみます。

# dtrace -s test.d

10秒間、何かを表示します。
■ちょっと解説
D言語の基本構造は次のようになっています。C言語に似ていますね。

プローブ記述
/述語/
{
	アクション
}
・「プローブ記述」は(provider:module:function:name)の4つから構成されています。
項目を省略することもできます。問題箇所を絞り込むために利用します。
指定できる詳細なリストは dtrace -l で表示します。
syscall::write:entry とはシステムコールの書き込みの入り口が呼び出されたらを意味します。

・「述語」で条件を指定します。
省略することもできます。
uid==0 とはユーザIDを0(ルート)に限定します。

・「アクション」で動作を決定します。
printf("%s",execname);とはプロセス名を表示します。
つまり、
「システムコールの書き込みの入り口が呼び出されたら、ユーザIDが0のプロセス名を表示しなさい」
というスクリプトでした。
D言語の基本構造を並記することで、並列処理させることができます。
profile:::tick-1sec
/i++>=10/
{
	exit(0);
}
とは10秒でdtraceを終了させることを意味します。便利な記述です。
これががないとCTRL-Cするまで永遠に dtrace を実行し続けます。
■集計関数
D言語には集計に便利な機能が盛り込まれています。従来であれば awk や perl を必要としました。
test.d を少し改良してみましょう。

# cat test1.d
syscall::write:entry
/uid==0/
{
	@c[execname]=count();
}

profile:::tick-1sec
/i++>=10/
{
	exit(0);
}
実行してみましょう。
# dtrace -s test1.d
dtrace: script 'test1.d' matched 2 probes
dtrace: buffer size lowered to 2m
dtrace: aggregation size lowered to 1m
CPU     ID                    FUNCTION:NAME
  0  39250                       :tick-1sec

  mozilla-bin                                                       2
  xscreensaver                                                      2
  gnome-netstatus-                                                  5
  dtrace                                                           10
  gnome-terminal                                                   25
  java                                                             82
■ちょっと解説
変更箇所はアクション部分です。集計関数と呼ばれるもので、次のような形で使われます。
@name[key]=aggfunc(args);

aggfunc(args)は集計関数であり、count()は呼び出された回数を返します。
@name は集積体と呼ばれる変数です。
プロセス名execnameをキーとして、呼び出された回数が各変数に格納されます。
つまり10秒間
「システムコールの書き込みの入り口が呼び出された回数を、ユーザIDが0のプロセス名ごとにカウントしなさい」
というスクリプトでした。
これによりどんなプロセスがシステムコールを頻繁に呼び出しているのかを分析することができます。
集計関数には sum(), avr(), min(), max(), quantize(), lquantize() などがあります。

投稿されたコメント:

技術評論社の細谷と申します。ブログへのコメントで失礼いたします。WEB+DB PRESSという技術情報誌でDTraceについての記事ご執筆をご相談させていただけないかと思い、ご連絡させていただいております。よろしければもう少し詳しくご説明させていただきますので、ご検討のほどお願いできませんでしょうか?
なにとぞよろしくお願いいたします。

Posted by 細谷謙吾 on 4月月 08日, 2009年 at 01:45 午後 JST #

コメント
  • HTML文法 不許可