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 の引数。アプリケーション引数がダッシュ(-)文字で始まる場合は、ダブルダッシュ(-)を使用してエスケープできることに注意してください。例: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 を開くために使用するブラウザー。指定しない場合は、デフォルトのシステムブラウザーが使用されます。
関連ページ:
API を使用したプロファイリングセッションの制御
プロファイリング API は、プロファイリングプロセスを制御できるようにする多数のクラスを提供します。例: アプリケーションのコードから、次のことができます。メモリのスナップショットを取得:,、メモリ割り当てデータの収集を有効または無効にします:,、ガベージコレクションを強制する:,、API クラスの詳細については、API 参照を参照してください。プロファイリング API を使用する必要がある主なシナリオは 2 つあります。コードの特定部分のプロファイリング、自己プロファイルアプリケーション。この...
IIS サーバー上のプロファイル Web アプリケーション
通常、Web アプリケーションのパフォーマンスの問題を特定するには、アプリケーションがすでにサーバー上で実行されている必要があります。次の表は、アプリケーションのプロファイリングに可能なすべてのオプションをまとめたものです。ローカルプロファイリング簡単な設定 / 使用: dotMemory の GUI を介してプロファイルします、dotMemory をサーバーにインストールして実行する必要があります。これは、セキュリティ上の制限や GUI の不在などにより不可能な場合があります。コマンドラインプ...