1 DTraceについて
DTraceは、Oracle LinuxにおいてUnbreakable Enterprise Kernel (UEK)とともに使用可能な強力な動的トレース・ツールです。豊富な機能セットを備え、ほとんどの共通プローブ・プロバイダをサポートしており、x86_64およびaarch64アーキテクチャで使用可能です。DTraceは、Universal Permissive License (UPL)バージョン1.0の下で使用可能なオープン・ソース・プロジェクトとして開発されています。ソース・コードおよび詳細は、https://github.com/oracle/dtrace-utilsを参照してください。
DTrace v2.0
DTrace v2.0は、DTraceをLinuxに初めて移植したときには存在しなかった、既存のLinuxカーネル・トレース機能(eBPFなど)を使用するDTraceの再実装です。この新しい実装では、特定のカーネル・パッチへのDTraceの依存関係が取り除かれています。
DTrace v2.0は、UEK R6以降とともに使用可能です。以前のバージョンのUEKには、元のDTrace実装が引き続き含まれます。
Oracle Linux 8上およびOracle Linux 9上のDTrace V2.0は、ユーザー・スペース・アプリケーションとして再実装されています。Oracle Linux 8上またはOracle Linux 9上での実行にlibdtrace-ctf
ライブラリが必要なくなりました。このライブラリの機能は、Oracle Linux GNUツールチェーンに統合されています。ただし、Oracle Linux 7では、まだlibdtrace-ctf
が必要です。
機能は使用可能になると提供されます。限られた一連の機能(主にフレームワーク機能であり、ユーザーの目に見える機能は多くない)から始まり、最終的には以前のサポートに到達し、それを上回ります。
使用例
次の例は、UEK R6上のDTrace v2.0の現在の機能を示しています。例では、コマンドがrootとして実行され、/usr/sbin
がPATH内にあることを前提にしています。
-
DTraceバージョン情報を表示します。
# dtrace -V DTrace 2.0.0 [Pre-Release with limited functionality] dtrace: Oracle D 2.0
-
プローブを一覧表示します。
# dtrace -l DTrace 2.0.0 [Pre-Release with limited functionality] ID PROVIDER MODULE FUNCTION NAME 1 dtrace BEGIN 2 dtrace END 3 dtrace ERROR 4 fbt vmlinux trace_initcall_finish_cb entry 5 fbt vmlinux trace_initcall_finish_cb return ...
この特定のシステムには、次のものが含まれています。
-
3 dtraceプローブ
-
87890 fbtプローブ(kprobesに基づく)
-
1262 sdtプローブ(Linuxトレースポイントに基づく)
-
666 syscallプローブ
-
-
コンパイルされたDコードをeBPFプログラムとして出力する
-S
オプションと、コンパイル後に終了する-e
オプションを使用するスクリプトの例:# dtrace -Sen 'write:entry { trace(1) }' DTrace 2.0.0 [Pre-Release with limited functionality] Disassembly of ::write:entry DIFO 0x46af600 returns D type (integer) (size 8) [record 16 bytes] INS OFF OPCODE INSTRUCTION 000 000: 62 a 0 fef8 ffffffff stw [%fp-264], -1 ! = EPID 001 008: 62 a 0 fefc 00000000 stw [%fp-260], 0 002 016: 7a a 0 ff00 00000000 stdw [%fp-256], 0 003 024: 7a a 0 ff08 00000000 stdw [%fp-248], 0 004 032: 7a a 0 ff10 00000000 stdw [%f [...]
-
スクリプトの例:
# dtrace -n ' syscall::write:* { this->x = 3; /* clause-local variables */ this->y = 8; trace(this->x * this->y); trace(&`max_pfn); }'
ここでは:
-
ワイルドカードを使用して、すべての
write()
システム・コール・プローブを一度にプローブ。 -
カーネル識別子(
max_pfn
)およびその他のデータ項目のアドレスを記録するプローブ。 -
複数のプローブを単一のアクションに関連付けます。
-
節ローカル変数が使用されます。
-
trace()
アクションを使用して出力が報告されます。
-