Solaris 動的トレースガイド

コンパイルと計測機能

Solaris で従来のプログラムを作成するときは、プログラムを記述したあと、コンパイラを使って、ソースコードを実行可能なオブジェクトコードに変換します。dtrace コマンドの使用時には、先ほど hello.d プログラムの記述に使用した D 言語用のコンパイラが呼び出されます。コンパイルの完了後、プログラムは DTrace で実行するためにオペレーティングシステムカーネルに送信されます。ここで、プログラムに指定されたプローブが有効になり、対応するプロバイダにより、これらのプローブをアクティブにするために必要な計測機能が実行されます。

DTrace の計測機能はすべて、完全に動的です。 使用されるプローブだけが、個別に有効になります。アクティブでないプローブに、計測機能用コードはありません。このため、DTrace を使用していないときに、システムのパフォーマンスが低下することはありません。計測が完了し、dtrace コマンドが終了すると、それまで使用していたすべてのプローブが自動的に無効になり、その計測機能が削除されます。こうして、システムは完全に元の状態に戻ります。DTrace がアクティブになっていないときのシステムの状態は、DTrace ソフトウェアがインストールされていないときのシステムの状態と実質的に同じです。

各プローブの計測機能は、稼働中のオペレーティングシステムまたはユーザーが選択したユーザープロセスに対して動的に実行されます。システムは休止または停止することなく、計測機能コードは有効になったプローブにのみ追加されます。このため、DTrace を使用したプローブの影響は、ユーザーが DTrace に指示した内容だけに制限されます。 関係のないデータがトレースされたり、システム内で一元的な「トレーススイッチ」がオンになったりすることはありません。このように、すべての DTrace 計測機能は、できるだけ能率よく機能するように設計されています。DTrace のこれらの機能を利用すれば、システムを停止することなく、リアルタイムで問題を解決できます。

DTrace フレームワークは、任意の数の仮想クライアントをサポートします。DTrace 計測や DTrace コマンドは、システムのメモリー容量が許すかぎり、好きな数だけ同時に実行できます。なお、DTrace コマンドは、配下にある共通の計測機能を使用しつつ、それぞれ独立して処理を行います。このため、1 つのシステム上で同時に DTrace を利用できるユーザーの数は、事実上無制限になります。 開発者、管理者、サービス担当者は、共同で作業できるだけでなく、同一システム上のさまざまな問題に、互いに干渉することなく個別に対処できます。

DTrace D プログラムは、安全な中間形式にコンパイルされたあと、プローブの起動時に実行されます。この点で、C や C++ より、JavaTM プログラミング言語で書かれたプログラムによく似ています。この中間形式の安全性は、DTrace カーネルソフトウェアがこのプログラムを最初に検査するときに検証されます。また、DTrace 実行環境は、D プログラムの実行中に発生する実行時エラー (ゼロ除算、無効なメモリーの間接参照など) を処理し、その結果をユーザーに報告します。このため、信頼性の低いプログラムを作成して、Solaris カーネルやシステムで実行中のプロセスに DTrace が害を及ぼす危険を回避できます。これらの安全性機能により、本稼働環境でシステムのクラッシュや破損を心配することなく DTrace を使用できます。プログラミングミスを犯しても、DTrace がエラーを報告し、計測機能を無効にするため、ユーザーはエラー箇所を修正し、再試行するだけで済みます。DTrace のエラー報告機能とデバッグ機能については、あとで説明します。

以下の図に、プロバイダ、プローブ、DTrace カーネルソフトウェア、dtrace コマンドをはじめとする、DTrace アーキテクチャの各種構成要素を示します。

図 1–1 DTrace のアーキテクチャと構成要素の概要

DTrace アーキテクチャ: カーネル機能およびプロバイダ、カーネルからライブラリへのドライバインタフェース、複数のコマンドをサポートするライブラリ。

DTrace の機能について理解できたところで、D プログラミング言語の解説に戻り、いくつかのプログラムを作成してみましょう。