16 DTraceの安定性機能
開発者に対しては、新しいテクノロジの早期アクセス版や、ユーザーおよびカーネル・ソフトウェアの内部実装の詳細を確認するための各種監視ツールが提供されます。ただし、インタフェースや実装は、ソフトウェアのアップグレードやパッチの適用を経て発展し成熟するため、新しいテクノロジや内部実装の詳細は、たびたび変更される傾向があります。
アプリケーションやインタフェースの安定性レベルは一連のラベルを使用して文書化されており、ユーザーはこの情報を基に、将来の様々なタイプのリリースで加えられる変更の種類を予測できます。あるDプログラムからアクセス可能な一連のエンティティやサービスについて、個々の安定性属性のみで説明できるものではありません。そのため、DTraceとDコンパイラには、作成するDプログラムの安定性レベルを動的に計算して記述する機能が用意されています。
この章では、安定したDプログラムを設計するためにプログラムの安定性を決定するDTrace機能について説明します。これらのDTraceの安定性機能を使用すると、Dプログラムの安定性属性を確認したり、プログラムのインタフェースに望ましくない依存関係が生じたときにコンパイル時エラーを発行することができます。
安定性レベル
DTraceには、組込み変数、関数、プローブなどのエンティティについて、2種類の安定性属性が用意されています。1つは安定性レベル、もう1つはアーキテクチャの依存クラスです。DTraceの安定性レベルは、インタフェースやDTraceエンティティが将来のリリースやパッチで変更される可能性を表しており、DTraceに基づいてスクリプトやツールを開発するときのリスク・アセスメントを行うのに役立ちます。DTraceの依存クラスは、あるインタフェースがすべてのOracle Linuxプラットフォームおよびプロセッサに共通のインタフェースであるのか、あるいは特定のアーキテクチャ専用のインタフェースであるのかを示します。インタフェースを記述するこの2種類の属性は、相互に依存することはありません。
次の表で、DTraceで使用される安定性の値について説明し、安定性の低い順にリストします。「安定」インタフェースのみに依存するアプリケーションは、今後のマイナー・リリースでも機能し、個別パッチを適用しても破損しません。それより安定性の低いインタフェースは、現在のシステムでの計測、プロトタイピング、チューニングおよびデバッグに対応しています。これらの安定していないインタフェースは、将来のマイナー・リリースで変更されたり、互換性のない状態になったり、削除されたり、代替のインタフェースに置き換えられることを理解したうえで使用する必要があります。
DTraceの安定性の値は、DTraceインタフェースの安定性のみでなく、監視対象のソフトウェア・エンティティの安定性を把握するためにも役立ちます。したがって、監視対象のソフトウェア・スタックをアップグレードしたり変更したりするときに、Dプログラムや階層化ツールの変更が必要になる可能性についても、DTraceの安定性の値から判断できます。
安定性値 | 説明 |
---|---|
内部 |
DTrace専用のインタフェースで、DTraceの実装の詳細を示します。「内部」インタフェースは、マイナー・リリースやマイクロ・リリースで変更される可能性があります。 |
非公開 |
Oracle専用のインタフェースであり、Oracleの他の製品のために開発されたインタフェースです。まだ顧客やISV (独立系ソフトウェア・ベンダー)向けに正式には文書化されていません。「非公開」インタフェースは、マイナー・リリースやマイクロ・リリースで変更される可能性があります。 |
廃止 |
現在のリリースではサポートされているが、将来的に、特にマイナー・リリースで削除される可能性のあるインタフェースです。「廃止」インタフェースを使用しようとすると、Dコンパイラから警告メッセージが出力されることがあります。 |
外部 |
このインタフェースはOracle以外によって管理されています。異なるリリース間での「外部」インタフェースのソースまたはバイナリ互換性について、Oracleはいっさい関与しません。これらのインタフェースに基づくアプリケーションは、「外部」インタフェースが含まれているパッチも含めて、将来のリリースでは動作しない可能性があります。 |
変更の可能性あり |
このインタフェースで、新しい、または頻繁に変更されるテクノロジや、システム動作の監視またはデバッグに必要な実装アーティファクトに、開発者が早期にアクセスできます。「変更の可能性あり」インタフェースのマイナー・リリース間でのソースまたはバイナリ互換性について、Oracleはいっさい関与しません。 |
発展中 |
将来的に「標準」インタフェースまたは「安定」インタフェースになる可能性があるが、まだ過渡期にあるインタフェースです。上位互換性のない変更が必要な場合は、マイナー・リリースとメジャー・リリースで行われます。こうした変更は、マイクロ・リリースでは可能なかぎり回避されます。このような変更が必要な場合は、影響を受けるリリースのリリース・ノートに記載されます。また、実現可能な場合は、バイナリ互換性および継続的なDプログラムの開発のために移行支援が提供されます。 |
安定 |
完成したインタフェースです。 |
標準 |
業界標準に準拠したインタフェースです。このインタフェースに対応する文書には、準拠する標準の説明が記載されています。通常、標準は標準開発組織によって制御されます。標準に対する承認済の変更に従って、インタフェースを変更できます。この安定性レベルは、業界の慣例により、(正規標準なしで)採用されたインタフェースにも適用されます。指定されたバージョンの標準のみがサポート対象になり、以降のバージョンがサポートされるかどうかは保証されていません。 |
依存クラス
Oracle LinuxとDTraceでは、様々なオペレーティング・プラットフォームとプロセッサがサポートされているため、DTraceでは、インタフェースを依存クラスに分類し、すべてのOracle Linuxプラットフォームとプロセッサに共通のインタフェースであるのか、特定のシステム・アーキテクチャ専用のインタフェースであるのかを区別しています。依存クラスは、このドキュメントで前述した安定性レベルとは異なります。たとえば、DTraceインタフェースを「安定」にして、x86_64マイクロプロセッサでのみサポートできます。または、インタフェースを「変更の可能性あり」にして、すべてのOracle Linuxプラットフォームに共通にできます。次の表では、DTraceの依存クラスについて、共通性の低いものから順にリストして説明します(最も共通性が低いクラスは、特定のアーキテクチャに固有のクラスです。最も共通性が高いクラスは、すべてのアーキテクチャに共通のクラスです)。
依存クラス | 説明 |
---|---|
不明 |
アーキテクチャの依存関係が不明なインタフェースです。DTraceは、オペレーティング・システム実装で定義されているデータ型など、すべてのエンティティについてアーキテクチャの依存関係を認識できるとはかぎりません。「不明」に分類されるのは通常、依存関係を計算できない、きわめて安定性の低いインタフェースです。現在使用中のアーキテクチャ以外でDTraceを使用するときには、このインタフェースが使用できない可能性があります。 |
CPU |
現在のシステムのCPUモデル固有のインタフェースです。CPUモデル依存のインタフェースは、その他のCPU実装では使用できない可能性があります。同じ命令セット・アーキテクチャ(ISA)をエクスポートするCPUでも同様です。 |
プラットフォーム |
現在のシステムのハードウェア・プラットフォーム固有のインタフェースです。プラットフォームは通常、システム構成要素とアーキテクチャの特性のセットを関連付けています。現在のプラットフォーム名を表示するには、uname -iコマンドを使用します。このインタフェースは、他のハードウェア・プラットフォームでは使用できない可能性があります。 |
グループ |
現在のシステムのハードウェア・プラットフォーム・グループ固有のインタフェースです。プラットフォーム・グループは通常、関連する特性を1つの名前で一連のプラットフォームに関連付けます。現在のプラットフォーム・グループ名を表示するには、uname -mコマンドを使用します。このインタフェースは、現在のプラットフォーム・グループの他のプラットフォームで使用可能ですが、このグループのメンバーでないハードウェア・プラットフォームでは使用できない可能性があります。 |
ISA |
このインタフェースは、現在のシステム上のマイクロプロセッサによってサポートされるISAに固有です。ISAは、マイクロプロセッサ上で実行可能なソフトウェアの仕様(アセンブリ言語命令、レジスタなどの詳細情報を含む)について説明したものです。システムでサポートされるネイティブの命令セットを表示するには、isainfoコマンドを使用します。このインタフェースは、同じ命令セットをエクスポートしないシステムではサポートされない可能性があります。 |
共通 |
基礎となるハードウェアとは関係なく、すべてのOracle Linuxプラットフォームに共通のインタフェースです。「共通」インタフェースのみに依存するDTraceプログラムと階層化アプリケーションは、Oracle LinuxとDTraceのリビジョンが共通している他のOracle Linuxプラットフォームにデプロイして実行できます。大部分のDTraceインタフェースは「共通」インタフェースのため、Oracle Linuxを使用するときはいつでも使用できます。 |
インタフェース属性
DTraceでは、2つの安定性レベルと1つの依存クラスから構成される3つ組の属性を使用してインタフェースを記述します。慣例上、インタフェース属性は次の順序で記述し、各属性をスラッシュで区切ります。
name_stability / data_stability / dependency_class
インタフェースの名前の安定性は、Dプログラムまたはdtraceコマンドラインに表示されるときのインタフェース名の安定性レベルを表します。たとえばD変数のexecname
は、安定した名前です。
インタフェースのデータの安定性は、インタフェース名に伴う安定性とは区別されます。この安定性レベルは、インタフェースおよび関連するデータ・セマンティクスで使用されるデータ・フォーマットの維持の確実性を表します。
インタフェースの依存クラスは、名前やデータ安定性と区別され、このインタフェースが現在のオペレーティング・プラットフォームやマイクロプロセッサに固有であるかどうかを表します。
DTraceとDコンパイラは、すべてのDTraceインタフェース・エンティティ(プロバイダ、プローブ記述、D変数、D関数、型およびプログラム文)の安定性属性を追跡します。これらのインタフェース・エンティティについては、この章で後述します。この3つの値すべてが互いに異なることがあります。たとえば、D変数のcurthread
には、「安定/非公開/共通」の属性があります。変数名は「安定」で、すべてのOracle Linuxプラットフォームに「共通」です。この変数は、Oracle Linuxカーネル実装のアーティファクトである「非公開」データ・フォーマットへのアクセスを提供することに注意してください。ほとんどのD変数はユーザー定義の変数であるため、Stable/Stable/Commonの属性を持っています。
安定性の計算およびレポート
Dコンパイラは、Dプログラムでの個々のプローブ記述とアクション文に対して、安定性の計算を実行します。コマンドラインに記述されたプログラムを使用する、次の例に示すように、dtraceコマンドを-vオプションを指定して使用すると、プログラムの安定性のレポートを表示できます。
# dtrace -v -n dtrace:::BEGIN'{exit(0);}' dtrace: description 'dtrace:::BEGIN' matched 1 probe Stability attributes for description dtrace:::BEGIN: Minimum Probe Description Attributes Identifier Names: Stable Data Semantics: Stable Dependency Class: Common Minimum Statement Attributes Identifier Names: Stable Data Semantics: Stable Dependency Class: Common CPU ID FUNCTION:NAME 0 1 :BEGIN
次の安定性レポートに示すように、プローブの有効化もプログラムの実行も行わずにプログラムの安定性を判定する場合は、-vオプションと-eオプションを組み合せて使用します。これにより、dtraceコマンドはDプログラムをコンパイルしますが、実行はしません。
# dtrace -ev -n dtrace:::BEGIN'{trace(curthread->parent);}' Stability data for description dtrace:::BEGIN: Minimum probe description attributes Identifier Names: Evolving Data Semantics: Evolving Dependency Class: Common Minimum probe statement attributes Identifier Names: Stable Data Semantics: Private Dependency Class: Common
この例では、新しいプログラムで、Dのcurthread
変数が参照されています。この変数にはStableの名前がありますが、Privateのデータ・セマンティクスがあります。これを見ると、カーネルの非公開実装の詳細にアクセスすることになります。このステータスは、プログラムの安定性レポートに反映されています。プログラム・レポートでの安定性属性は、3つ組のインタフェース属性に対応する値から最小の安定性レベルとクラスを選択することで計算されます。
プローブ記述の安定性属性は、プロバイダによって発行された属性に応じて、指定されたすべてのプローブ記述フィールドの最小の安定性属性をとることによって計算されます。DTraceプロバイダで使用可能な属性については、対応する各プロバイダの項を参照してください。DTraceプロバイダは、そのプロバイダが公開しているすべてのプローブの4つの記述フィールドそれぞれに対して、3つ組の安定性属性をエクスポートします。そのため、プロバイダの名前の方が、このプロバイダでエクスポートされる各プローブよりも安定性が高い場合があります。簡略にするために、ほとんどのプロバイダは公開する個々のモジュール関数名の値すべてに対して単一の属性セットを使用します。プローブ引数の安定性はプロバイダごとに異なるため、プロバイダはargs[]
配列の属性も指定します。
プローブ記述でプロバイダ・フィールドが指定されていない場合、この記述には「変更の可能性あり/変更の可能性あり/共通」の安定性が割り当てられます。これは、この記述が今後のリリースのOracle Linuxで使用されたとき、現在まだ存在しないプロバイダのプローブと照合される可能性があるためです。したがって、Oracleはこのプログラムの将来の安定性と動作については保証しません。Dプログラム節を記述する際には、常にプロバイダを明示的に指定する必要があります。また、パターン・マッチング文字や$1
のようなマクロ変数を含むプローブ記述フィールドは、未指定として扱われます。これは、これらの記述パターンを展開すると、将来のDTraceやOracle Linuxでリリースされるプロバイダまたはプローブと照合される可能性があるためです。パターン・マッチング文字およびマクロ変数の詳細は、「Dプログラム構造」および「スクリプトの作成」を参照してください。
ほとんどのD言語文では、その文のエンティティの最小の安定性とクラスをとることで安定性属性を計算します。D言語エンティティとその安定性属性を次の表に示します。
エンティティ | 属性 |
---|---|
D組込み変数 |
安定/非公開/共通 |
Dユーザー定義変数 |
安定/安定/共通 |
たとえば、次のDプログラム文を記述した場合、この文の属性は「安定/非公開/共通」になり、最小属性は、curthread
とx
のオペランドに関連付けられます。
x += curthread->prio;
式の安定性は、各オペランドの最小の安定性属性をとることで計算されます。
プログラムで定義するD変数には、「安定/安定/共通」の属性が自動的に割り当てられます。また、D言語の文法やD演算子には、これら3つの属性が暗黙的に割り当てられます。逆引用符演算子(`
)によるカーネル・シンボルの参照には、常に「非公開/非公開/不明」の属性が割り当てられます。これらは実装アーティファクトを反映しているためです。Dプログラム・ソース・コードで定義した型、具体的にはC型やD型の名前空間に関連付けられた型には、「安定/安定/共通」の属性が割り当てられます。オペレーティング・システム実装で定義され、他の型の名前空間から提供された型には、「非公開/非公開/不明」の属性が割り当てられます。D型キャスト演算子では、入力式の属性とキャスト出力型の属性の最小値である安定性属性を持つ式が生成されます。
Cプリプロセッサを使用してCシステム・ヘッダー・ファイルをインクルードする場合、これらの型には、C型の名前空間が関連付けられ、属性「安定/安定/共通」が割り当てられます。これは、Dコンパイラでは、ユーザーがこれらの宣言を実行すると自動的に仮定されるためです。したがって、Cプリプロセッサを使用して実装アーティファクトを含むヘッダー・ファイルをインクルードする場合、プログラムの安定性について考えを誤る可能性があります。正しい安定性レベルを判断できるように、インクルードするヘッダー・ファイルに対応する文書を常に参照する必要があります。
安定性の強制
DTraceスクリプトや階層化ツールを開発するとき、安定性の問題の原因を特定したり、プログラムの安定性属性のセットが適切であることを確認することができます。属性の計算結果として、コマンドラインに指定した最小値未満の3つ組の属性が得られた場合に、Dコンパイラに強制的にエラーを返させるには、dtraceコマンドで-x amin=_attributes_オプションを使用します。
次の例は、Dプログラム・ソースのスニペットを使用した、-x aminオプションの使用方法を示しています。属性は、3つのラベル(デリミタ/
付き)で通常の順序で指定されています。
# dtrace -x amin=Evolving/Evolving/Common \ -ev -n dtrace:::BEGIN’{trace(curthread->parent);}’ dtrace: invalid probe specifier dtrace:::BEGIN{trace(curthread->parent);}: \ in action list: attributes for scalar curthread (Stable/Private/Common) \ are less than predefined minimum