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()アクションを使用して出力が報告されます。