dotMemory コマンドラインプロファイラーを使用する
dotMemory コマンドラインプロファイラーを使用すると、任意の .NET または .NET Core アプリケーション (すでに実行中のものも含む) をプロファイリングし、メモリスナップショットを取得できます。
このツールは、さまざまなシナリオで役立ちます。
リモートサーバーでのアプリケーションのプロファイリング
例: これは、スタンドアロン dotMemory をサーバーにインストールできない場合に当てはまります。
メモリスナップショットを収集するプロセスの自動化
例: プロファイリングを継続的インテグレーションビルドの一部にしたい場合: これは、統合テストのプロファイリングを実行するビルドステップにすることができます。
プロファイリングルーチンの高速化
例: 同じアプリケーションを定期的にプロファイリングし、毎回 dotMemory ユーザーインターフェースを起動したくない場合。
分布
このツールは、 .zip アーカイブまたは NuGet パッケージ (Windows(英語)、 Linux(英語)、 macOS(英語)) として無料で配布されており、dotMemory をインストールする必要はありません。 任意のコンピューターに自由にアップロードして、問題のあるアプリケーションのメモリスナップショットを取得できます。
主なプロファイラーコマンド
get-snapshot- 実行中のアプリのスナップショットを即座に取得します。attach- プロファイラを実行中のアプリケーションに接続し、条件を使用して、API を使用して、または stdin にコマンドを送信してスナップショットを取得します。start- アプリを起動し、条件を使用して、API を使用して、または stdin にコマンドを送信してスナップショットを取得します。start-net-core- .NET Core アプリを起動し、API を使用して、または stdin にコマンドを送信することにより、条件別にスナップショットを取得します。start-iis- (Windows のみ)IIS を起動し、API を使用して、または stdin にコマンドを送信することにより、条件によってスナップショットを取得します。start-iis-express- (Windows のみ)プロファイルで IIS Express がホストする Web アプリケーションを起動します。start-windows-service- (Windows のみ)プロファイリングでマネージ Windows サービスを(再)開始し、条件または API を使用してメモリスナップショットを取得します。start-wcf-service- (Windows のみ)プロファイリングで指定された WCF サービスライブラリを使用して WCF ホストを(再)起動し、条件または API を使用してメモリスナップショットを取得します。start-winrt- (Windows のみ)プロファイリングで WinRT アプリケーションを起動し、条件または API を使用してメモリスナップショットを取得します。profile-new-processes- (Windows のみ)このコマンドの実行後に起動される管理対象アプリケーションをプロファイルします。list-iis-express- (Windows のみ)使用可能な IIS Express インストールのリストを表示します。list-wcf-host- (Windows のみ)使用可能な WCF ホストのリストを表示します。list-winrt- (Windows のみ)使用可能な WinRT アプリケーションのリストを表示します。
特定のコマンドの詳細情報を取得するには、 dotMemory.exe help <command> (Windows)、 ./dotMemory.sh help <command> (Linux、macOS) を実行します。
実行中のアプリケーションのスナップショットを取得する
これは最も単純で最も要求の厳しいシナリオです。 必要なのは、dotMemory にプロファイルするアプリケーションを指示することだけです。 これは、アプリケーション名または PID の 2 つの方法で実行できます。
実行中のアプリケーションのスナップショットを PID(例: 6844)で即座に取得するには:
コマンドを実行します:
dotMemory.exe get-snapshot 6844 --save-to-dir=C:\Snapshots
ここに:
--save-to-dir=C:\Snapshots- (オプション)スナップショットを保存するディレクトリへのパス(より正確には、ワークスペース.dmwファイル)。 この場合、スナップショットのファイル名は自動的に生成されます。 自分でファイル名を指定する場合は、--save-to-fileオプションを使用します。6844- プロセス PID(ウィンドウタスクマネージャーでそれを見つけることができます)。
実行中のアプリケーションのスナップショットを PID(例: 6844)で即座に取得するには:
コマンドを実行します:
./dotMemory.sh get-snapshot 6844 --save-to-dir=~/Snapshots
ここに:
--save-to-dir=~/Snapshots- (オプション)スナップショットを保存するディレクトリへのパス(より正確には、ワークスペース.dmwファイル)。 この場合、スナップショットのファイル名は自動的に生成されます。 自分でファイル名を指定する場合は、--save-to-fileオプションを使用します。6844- プロセス PID(psシステムコマンドを使用して見つけることができます)。
実行中のアプリケーションのスナップショットをその名前で即座に取得するには
コマンドを実行します:
dotMemory.exe get-snapshot MyApp --with-max-memまたは
dotMemory.exe get-snapshot MyApp --all
ここに:
MyApp- プロセス名(Windows のタスクマネージャーで見つけることができます)。 そのような名前のプロセスが複数ある場合は、--with-max-memまたは--allオプションを使用してあいまいさを解消できます。--with-max-mem- ほとんどのメモリを消費するプロセスがプロファイルされます。--all- 指定された名前のすべてのプロセスがプロファイルされます。 dotMemory はすべてのプロセスのスナップショットをとります(プロセスごとのスナップショット)。
実行中のアプリケーションのスナップショットをその名前で即座に取得するには
コマンドを実行します:
./dotMemory.sh get-snapshot MyApp --with-max-memまたは
./dotMemory.sh get-snapshot MyApp --all
ここに:
MyApp- プロセス名(psシステムコマンドを使用して見つけることができます)。 そのような名前のプロセスが複数ある場合は、--with-max-memまたは--allオプションを使用してあいまいさを取り除くことができます。--with-max-mem- ほとんどのメモリを消費するプロセスがプロファイルされます。--all- 指定された名前のすべてのプロセスがプロファイルされます。 dotMemory はすべてのプロセスのスナップショットをとります(プロセスごとのスナップショット)。
アプリケーションを起動し、条件に応じてスナップショットを取得する
長い時間間隔でアプリケーションのメモリ使用量をトラックする必要がある場合があります。 この場合、プロファイリングの下でアプリケーションを起動し、特定の条件が満たされた場合にのみスナップショットを取得できます。条件とは、一定の時間間隔が終了するか、メモリ使用量が指定された値だけ増加することです。
MyApp.exe を起動してスナップショットを定期的に取得するには
コマンドを実行します:
dotMemory.exe start --trigger-timer=30s C:\MyApp\MyApp.exe MyAppArg1
ここに:
--trigger-timer=30s- スナップショットを撮るための期間(この場合は 30 秒)。C:\MyApp\MyApp.exe - プロファイルアプリケーションの実行可能ファイルへのパス。
MyAppArg1- (オプション)MyApp.exe の引数。 アプリケーションの引数がダッシュ(-)文字で始まる場合は、2 つのダッシュ(-)を使用してエスケープできることに注意してください。 例えば:dotMemory.exe start --trigger-timer=30s C:\MyApp\MyApp.exe -- -MyAppArg1
MyApp を起動して定期的にスナップショットを取得するには
コマンドを実行します:
./dotMemory.sh start --trigger-timer=30s ~/MyApp/MyApp my-app-arg1
ここに:
--trigger-timer=30s- スナップショットを撮るための期間(この場合は 30 秒)。~/MyApp/MyApp - プロファイルアプリケーションの実行可能ファイルへのパス。
my-app-arg1- (オプション)MyApp の引数。 アプリケーションの引数がダッシュ(-)文字で始まる場合は、2 つのダッシュ(-)を使用してエスケープできることに注意してください。 例えば:./dotMemory.sh start --trigger-timer=30s ~/MyApp/MyApp -- -my-app-arg1
メモリ消費が指定された値だけ増加すると、MyApp.exe を起動してスナップショットを取得する
コマンドを実行します:
dotMemory.exe start --trigger-mem-inc=50% --trigger-delay=5s C:\MyApp\MyApp.exe
ここに:
--trigger-mem-inc=50%- スナップショットは、MyApp のメモリ消費量が 50% 増加したときにのみ取得されます。--trigger-delay=5s- アプリケーションの起動フェーズをスキップするために、5 秒の間にトリガーが有効になります。
メモリ使用量が指定した値だけ増加したときに MyApp を起動してスナップショットを作成するには
コマンドを実行します:
./dotMemory.sh start --trigger-mem-inc=50% --trigger-delay=5s ~/MyApp/MyApp
ここに:
--trigger-mem-inc=50%- スナップショットは、MyApp のメモリ消費量が 50% 増加したときにのみ取得されます。--trigger-delay=5s- アプリケーションの起動フェーズをスキップするために、5 秒の間にトリガーが有効になります。
プロファイルされたアプリケーションの開始直後にスナップショットを取得したい場合があります。 例: このスナップショットを比較のベースとして使用できます。
プロファイラーが初期化された直後に MyApp.exe を起動してスナップショットを取得するには
コマンドを実行します:
dotMemory.exe start --trigger-on-activation C:\MyApp\MyApp.exe
ここに:
--trigger-on-activation- プロファイラーが初期化されるとすぐにスナップショットが作成されます。--trigger-delayが設定されている場合、--trigger-on-activationはこの遅延を待つことに注意してください。
MyApp を起動して、プロファイラーが初期化された直後にスナップショットを取得するには
コマンドを実行します:
./dotMemory.sh start --trigger-on-activation ~/MyApp/MyApp
ここに:
--trigger-on-activation- プロファイラーが初期化されるとすぐにスナップショットが作成されます。--trigger-delayが設定されている場合、--trigger-on-activationはこの遅延を待つことに注意してください。
アプリケーションを起動し、標準入力メッセージを使用してスナップショットを取得する
プロファイリングプロセスを直接制御する必要がある場合もあります。例えば、特定のタイミングでコマンドを直接実行してスナップショットを取得するなどです。 これは、コマンドラインプロファイラーの stdin に特別なメッセージを送信することで実行できます。
重要なメモ:
stdin に送信されるメッセージは、常に改行で始まり、キャリッジリターンで終わる必要があります。
stdin メッセージと stdout メッセージはどちらも、
##dotMemory["get-snapshot", {pid:1234}]などの JSON 配列の形式になっています。stdin にメッセージを送信する代わりに、ファイルに書き込むことができます。 ファイルの場所を指定するには、
--service-input=path\to\file.svcパラメーターを使用します。 メッセージの形式は stdin の場合と同じです。
MyApp.exe を起動し、stdin メッセージを使用してプロファイリングを制御するには
追加の引数は必要ありません。
attachまたはstartコマンドのいずれかを使用して、通常どおりプロファイリングを開始できます。 例えば:dotMemory.exe start C:\MyApp\MyApp.exedotMemory は、特別なサービスメッセージを stdout に送信することにより、プロファイリングプロセスの進行状況を通知できます。 これは、外部スクリプトによってプロファイリングを制御する場合に特に役立ちます。 stdout メッセージのサポートを有効にするには、
--service-outputオプションを指定して dotMemory を実行します(例:dotMemory.exe start --service-output C:\MyApp\MyApp.exedotMemory は次のメッセージを stdout に送信します。
プロファイリングセッションの開始
##dotMemory["connected", {pid: 1234}]スナップショットを保存する
##dotMemory["workspace-saved", {path: "..."}]
stdin に次のコマンドを送信してスナップショットを取得します。
##dotMemory["get-snapshot", {pid:1234}]pidが指定されている場合、dotMemory は指定された PID のプロセスのスナップショットを取得します。 それ以外の場合、dotMemory はプロファイル中のすべてのプロセスのスナップショットを取得します。プロファイリングを停止し、プロファイル中のアプリケーションを終了するには、次のコマンドを stdin に送信します:
##dotMemory["disconnect"]すべての
startコマンドでattachで開始したプロファイリングセッションに対して機能します。
MyApp を起動し、stdin メッセージを使用してプロファイリングを制御するには
追加の引数は必要ありません。
attachまたはstartコマンドのいずれかを使用して、通常どおりプロファイリングを開始できます。 例えば:./dotMemory.sh start ~/MyApp/MyAppdotMemory は、特別なサービスメッセージを stdout に送信することにより、プロファイリングプロセスの進行状況を通知できます。 これは、外部スクリプトによってプロファイリングを制御する場合に特に役立ちます。 stdout メッセージのサポートを有効にするには、
--service-outputオプションを指定して dotMemory を実行します(例:./dotMemory.sh start --service-output ~/MyApp/MyAppdotMemory は次のメッセージを stdout に送信します。
プロファイリングセッションの開始
##dotMemory["connected", {pid: 1234}]スナップショットを保存する
##dotMemory["workspace-saved", {path: "..."}]
stdin に次のコマンドを送信してスナップショットを取得します。
##dotMemory["get-snapshot", {pid:1234}]pidが指定されている場合、dotMemory は指定された PID のプロセスのスナップショットを取得します。 それ以外の場合、dotMemory はプロファイル中のすべてのプロセスのスナップショットを取得します。プロファイリングを停止し、プロファイル中のアプリケーションを終了するには、次のコマンドを stdin に送信します:
##dotMemory["disconnect"]すべての
startコマンドでattachで開始したプロファイリングセッションに対して機能します。
アプリケーションを起動し、API を使用してスナップショットを取得する
また、 API を使用してプロファイリングを制御する(スナップショットの取得、プロセスからの切り離しなど)オプションもあります。
MyApp.exe を起動し、API を使用してプロファイリングを制御するには
コマンドを実行します:
dotMemory.exe start --use-api C:\MyApp\MyApp.exe
MyApp を起動して API でプロファイリングを制御するには
コマンドを実行します:
./dotMemory.sh start --use-api ~/MyApp/MyApp
実行中のアプリケーションに接続してプロファイルを作成する
すでに実行中のアプリケーションをプロファイリングし、プロファイリングプロセスを完全に制御する場合(get-snapshot シナリオとは異なります)、 attach コマンドを使用する必要があります。 これにより、プロファイラーは実行中のプロセスに(PID または名前および get-snapshot によって)接続し、トリガー、stdin コマンド、API を使用してスナップショットを取得できます。 たとえば、実行中のアプリ MyApp のプロファイルを作成し、トリガーを使用してスナップショットを取得する方法の例を次に示します。
実行中のアプリケーションにアタッチして定期的にスナップショットを取得するには
コマンドを実行します:
dotMemory.exe attach MyApp.exe --trigger-timer=30s
実行中のアプリケーションにアタッチして定期的にスナップショットを取得するには
コマンドを実行します:
./dotMemory.sh attach MyApp --trigger-timer=30s
(Windows のみ) IIS でホストされる Web アプリケーションの実行とプロファイリング
IIS サーバー上で実行される ASP.NET Web アプリケーションをプロファイリングする場合は、 start-iis コマンドを使用する必要があります。 コマンドを実行すると、プロファイリングで IIS が開始されます (IIS でホストされるアプリのプロファイリング方法の詳細については、「IIS サーバー上のプロファイル Web アプリケーション 」を参照してください)。 start-iis は、トリガー、stdin コマンド、API を使用して、 start コマンドと同じプロファイリング制御方法をサポートしていることに注意してください。 たとえば、Web アプリをプロファイリングし、トリガーを使用してスナップショットを取得する方法の例を次に示します。
プロファイリングで IIS を実行し、定期的にスナップショットを取得するには
コマンドを実行します:
dotMemory.exe start-iis --trigger-timer=30s --open-url=localhost/myapp --use-browser=Chrome
ここに:
--open-url=localhost/myapp- プロファイリングを実行した後に開くプロファイリングされたアプリケーションの URL。--use-browser=Chrome- URL を開くために使用するブラウザー。 指定しない場合は、デフォルトのシステムブラウザーが使用されます。