ddprof はベータ版です。Datadog では、本番環境にデプロイする前に重要でない環境でプロファイラーを評価することを推奨しています。

コンパイル済み言語用ネイティブプロファイラー (ddprof) は、OS レベルの API を使用してプロファイリングデータを収集します。C、C++、Rust などのコンパイルされた言語で書かれたアプリケーションに最適です。 ddprof から送信されたプロファイラーが、Datadog Web アプリの_ネイティブ_ランタイムに表示されます。

要件

すべての言語におけるランタイムとトレーサーの最小バージョンと推奨バージョンの要約については、サポートされている言語とトレーサーのバージョンをお読みください。

対応 OS
Linux (glibc または musl)
対応アーキテクチャ
amd64 プロセッサーまたは arm64 プロセッサー
サーバーレス
ddprof は、AWS Lambda などのサーバーレスプラットフォームには対応していません。
OS 設定
perf_event_paranoid カーネル設定は 2 以下です (トラブルシューティングを参照してください)。
デバッグ情報
シンボルが利用可能である必要があります。シンボルテーブルが削除されると、プロファイラーが人間が読める関数名を提供できません。

インストール

プロファイラーは、スタンドアロン実行ファイルとして、またはライブラリとして使用することができます。ライブラリとして使用する場合は、ライブラリのインストール方法までスキップしてください。

スタンドアロン

  1. 最新の ddprof リリースをダウンロードします。例えば、amd64 (別名 x86_64) プラットフォーム用の最新リリースを取得する一つの方法は以下の通りです。

    curl -Lo ddprof-linux.tar.xz https://github.com/DataDog/ddprof/releases/latest/download/ddprof-amd64-linux.tar.xz
    tar xvf ddprof-linux.tar.xz
    mv ddprof/bin/ddprof INSTALLATION_TARGET
    

    ここで、INSTALLATION_TARGETddprof のバイナリを保存する場所を指定します。この後の例では、INSTALLATION_TARGET./ddprof に設定されていると仮定しています。

    aarch64 プラットフォームでは amd64 の代わりに arm64 を使用してください。

  2. プロファイラーを含むようにサービス呼び出しを修正します。いつものコマンドは ddprof 実行ファイルへの最後の引数として渡されます。

    export DD_ENV=prod
    export DD_SERVICE=my-web-app
    export DD_VERSION=1.0.3
    ./ddprof myapp --arg1 --arg2
    

    : 通常、シェルビルトインを使用してアプリケーションを起動する場合、例えば、

    exec myapp --arg1 --arg2
    

    その場合は、代わりにそのビルトインで ddprof を呼び出す必要があります。

    export DD_ENV=prod
    export DD_SERVICE=my-web-app
    export DD_VERSION=1.0.3
    exec ./ddprof myapp --arg1 --arg2
    
    ./ddprof --environment prod --service my-web-app --service_version 1.0.3 myapp --arg1 --arg2
    

    : 通常、シェルビルトインを使用してアプリケーションを起動する場合、例えば、

    exec myapp --arg1
    

    その場合は、代わりにそのビルトインで ddprof を呼び出す必要があります。

    exec ./ddprof --environment prod --service my-web-app --service_version 1.0.3 myapp --arg1 --arg2
    

  3. アプリケーションの起動数分後、Datadog APM > Profiler ページにプロファイルが表示されます。

ライブラリ

このライブラリは、C 言語の API を公開しています。

  1. ddprof のライブラリサポート付きリリース (v0.8.0 以降) をダウンロードし、tarball を抽出します。例:

    curl -Lo ddprof-linux.tar.xz https://github.com/DataDog/ddprof/releases/latest/download/ddprof-amd64-linux.tar.xz
    tar xvf ddprof-linux.tar.xz --directory /tmp
    
  2. コード内で、リリースで提供される _dd_profiling.h_ ヘッダーで定義される ddprof_start_profiling() インターフェイスを使用して、プロファイラーを開始します。プログラムが終了すると、プロファイラーは自動的に停止します。プロファイラーを手動で停止させるには、 ddprof_stop_profiling(ms) を使用します。ms パラメーターは、関数の最大ブロック時間をミリ秒で表します。以下は、C 言語のスタンドアロン例 (profiler_demo.c) です。

    #include <stdlib.h>
    #include "dd_profiling.h"
    
    int foo(void) {
      int n = 0;
      for (int i = 0; i < 1000; i++) {
        n += 1;
      }
      return n;
    }
    
    int main(void) {
      // Initialize and start the Datadog profiler. Uses agent defaults if not
      // specified
      setenv("DD_ENV", "prod", 1);
      setenv("DD_SERVICE", "c_testservice", 1);
      setenv("DD_VERSION", "1.0.3", 1);
      ddprof_start_profiling();
    
      // Do some work
      for (int i = 0; i < 1e6; i++) {
        foo();
      }
      return 0;
    }
    
  3. 抽出したディレクトリの includelib サブディレクトリをビルドシステムに渡し、 libdd_profiling に対してリンクします。上記の例の場合:

    gcc -I/tmp/ddprof/include -L/tmp/ddprof/lib profiler_demo.c -o profiler_demo -ldd_profiling
    

共有ライブラリのデプロイ

共有ライブラリは、システムのライブラリ検索パスに存在する必要があります。そうでない場合は、アプリケーションの起動に失敗します。先ほどの例で言うと:

./profiler_demo
./profiler_demo: error while loading shared libraries: libdd_profiling.so: cannot open shared object file: No such file or directory

スタティックライブラリに対してリンクすることで、これを回避することができます。

ライブラリのインストール

ライブラリを既存の検索ディレクトリにコピーして、検索パスに追加します。検索ディレクトリを調べるには、Linux システムで、以下を実行します。

ld --verbose | grep SEARCH_DIR | tr -s ' ;' \\n

検索ディレクトリの追加

環境変数 LD_LIBRARY_PATH を使って、ランタイムリンカーに追加の検索パスを追加します。例えば、先ほどのディレクトリレイアウトを使って:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/tmp/ddprof/lib

構成

environmentserviceservice_version の設定は、プロファイリング UI で使用されるため、推奨されます。

パラメーターの全リストを参照するか、コマンドラインを使用してください。

ddprof --help

ロギング

複数のエンドポイントのうちの 1 つにログを構成することができます。

  • stdout はログを標準出力ストリームに出力します (デフォルト)。
  • stderr はログを標準エラーストリームに出力します。
  • syslog は、RFC 3164 の仕様に準拠するように、ログを syslog に発行します。
  • disable はログを完全に無効にします。
  • それ以外の値はファイルパスとして扱われ、先頭の / は絶対パスを意味します。

グローバル

実行中のすべてのプロセスをインスツルメンテーションしたい場合は、--global オプションを試してみてください。 グローバルモードはデバッグ用です。このモードでは権限の昇格が必要です。セットアップによっては、root で実行し、CAP_PERFMONCAP_SYSADMIN を許可するか、perf_event_paranoid-1 に設定する必要があります。

./ddprof --environment staging --global --service_version full-host-profile

ほとんどの構成では、これはプロファイラーの PID ネームスペースで見えるすべてのプロセスで構成されます。

次のステップ

プロファイラーの概要ガイドでは、パフォーマンスの問題があるサンプルサービスを例に、Continuous Profiler を使用して問題を理解し修正する方法を確認します。

その他の参考資料