Solaris 10の強化機能としてクローズアップされることが多い「DTrace」。さまざまなサービスが並列稼働する基幹サーバでは、カーネル挙動によってボトルネックを判断することも多い。DTraceは、解決するための打開策となるのか? 実例サンプルで検証していく。
Solaris 10の目玉となる機能のひとつに、実行中のサーバ情報をいつでも取得できる「DTrace」がある。DTraceは、稼働サーバ上で思うようなパフォーマンスが得られなかったり、トラブルが生じた際に原因究明するのに役立つ機能だ。この「OS選択の新常識」Solaris特集では、DTraceを使うと具体的にどのような情報を取得でき? どのようなシーンで役立つのか? その実例を解説していくことにしよう。
まずは簡単に、DTraceの仕組みから説明する。
Solaris 10の内部には、「プローブ」と呼ばれる約3万個所のデータ観測ポイントが用意されている。そして、このプローブを提供するプログラムのことを「DTraceプロバイダ」と呼ぶ。DTraceプロバイダは、表1に示すいくつかのカテゴリに分類されているのだ。
プロバイダ | 提供される主な情報 |
---|---|
dtrace | DTraceの開始時や終了時、エラー発生時などにイベントが発生するプローブ。後述のDスクリプトでプログラムするときに、初期化処理や終了処理、エラー処理などを記述する時に用いる |
lookstat | ロック状態が変化した時にイベント発生するプローブ |
profile | 一定時間ごとにタイマイベントを発生するプローブ。定期的に値を集計したい時などに用いる |
fbt | Function Boundary Tracing。カーネル内部の関数への突入/退出ごとにイベントを発生するプローブ |
syscall | システムコールへの突入/退出ごとにイベント発生するプローブ |
sbt | Statically Defined Tracing。アプリケーション定義のプローブ。アプリケーション開発者があらかじめsys/sdt.hにある関数群を呼び出し、DTraceのイベントを発生させるように構成する時、該当ルーチンを通過するとイベント発生する |
sysinfo | カーネルのステータス情報(kstat -n sysで取得できる情報)を提供するプローブ |
vminfo | カーネルの仮想メモリ情報(kstat -n vmで取得できる情報)を提供するプローブ |
proc | プロセスの生成、終了、シグナル受信などが発生した時にイベント発生するプローブ |
sched | CPUスケジューリングに関する情報を提供するプローブ |
io | ディスク入出力情報に関するプローブ。iostatコマンドで取得できる情報を提供する |
mib | Management Information Bases(MIB)情報を提供するプローブ。kstat -nやnetstatコマンドで取得できる情報を提供する |
fpuinfo | SPARCプロセッサのFPUシミュレート機能状態を提供するプローブ |
pid | 任意のプロセスIDをもつプロセス内の指定した位置の関数への突入/退出ごとにイベントを発生するプローブ |
plockstat | プロセスのロック状態を知らせるプローブ |
fasttrap | ユーザープロセスがDTraceを呼び出すときに、そのユーザープロセスに対してデータを流し込むためのハンドラ。現状では利用されない |
プローブから何か情報を得るためには、dtraceコマンドを用いる。dtraceコマンドを始めとするプローブから情報所得するプログラムを「DTraceコンシューマ」という。
DTraceコンシューマを使ってプローブを活性化すると、プローブ部分を通過した時にDTraceコンシューマがコールバックされる仕組みだ。この時、引数としてプローブからの情報が渡される。
つまりDTraceとは、あらかじめプローブに対して「該当部分を通過したら通知してほしい」などと登録することにより、カーネルや実行中のアプリケーションをリアルタイムにトレースする機能なのだ(図1)。
各種DTraceプロバイダは、標準で組み込まれており、DTraceを使う時にカーネルやアプリケーションを再コンパイルする必要はない。
なお標準では、DTraceを利用できるユーザーは、rootユーザーのみに制限されている。これは、プローブからメモリへの読み書きや送受信されているデータ(キー入力も含む)を覗き見ることができるため、セキュリティ上好ましくないためだ(実際に後の例で、ファイルへの書き込みを覗き見る方法を例として説明する)。
Copyright © ITmedia, Inc. All Rights Reserved.