はじめに
ここでいうプロファイル
とは、CPU使用時間やメモリ使用量などの計測結果のことを指します。
この記事の目的はdotnet-traceの紹介です。
最新の情報は公式ドキュメントをご参照ください。
プロファイルを取る手順
ツールのインストール
多くの場合はDockerイメージを使用していると思います。
そんな時は以下のような手順でdotnet-trace
をインストールするとよいでしょう。
また、必要に応じてPATH
に設定してもよいかもしれません。
# ツールをtoolsという名前のイメージの`/tools`にインストールする
FROM mcr.microsoft.com/dotnet/sdk:{バージョン} AS tools
RUN dotnet tool install --tool-path /tools dotnet-trace
# 最終イメージの記述
FROM mcr.microsoft.com/dotnet/aspnet:{バージョン} AS final
...
# toolsイメージからインストールしたツールを最終イメージの`/tools`へコピーしてくる
WORKDIR /tools
COPY --from=tools /tools .
参考 : マルチステージビルドの利用
書き込み先の用意
書き込み権限のある領域を作成しておきます。
単なるDockerイメージの場合は不要かもしれません。(未確認)
- kubernetesの場合
volumeMounts: - mountPath: /tmp name: tmp ... volumes: - name: tmp emptyDir: {}
- docker-composeの場合
tmpfs: - /tmp
実行
起動と同時にプロファイルを取る場合
初めからプロファイルを取る目的で起動する場合はENTRYPOINT
あたりでdotnet-trace
を指定してあげると良さそうです。(未確認)
# 動作未確認
ENTRYPOINT ["/tools/dotnet-trace", "collect", "--", "dotnet", "exec", "DLL名"]
起動しているプロセスからプロファイルを取る場合
多くの場合は既に起動しているプロセスからプロファイルを取りたいと思います。(主観)
その場合は以下のように指定することでプロファイルを取ることができます。
# processIDを取得する
$ /tools/dotnet-trace ps
20 dotnet /usr/share/dotnet/dotnet dotnet {DLL名}
# プロファイルを取る
# /tmpは上で作成した書き込み用ボリュームを、profile.nettraceには好きな名前を指定できます。
$ /tools/dotnet-trace collect -p 20 -o /tmp/profile.nettrace
...(出力内容省略)...
Press <Enter> or <Ctrl+C> to exit
--duration
など、オプションについては公式ドキュメントをご確認ください。
コンテナからプロファイルファイルを取得する
- kubernetesの場合
- kubectl cpでできます。
- docker-composeの場合
-
docker compose cpでできるらしいです。(未確認)
- 手元で試したところ
Error: No such container:path: f09c185d91f7:/tmp/profile.nettrace
と言われて詰まったorz
- 手元で試したところ
-
docker compose cpでできるらしいです。(未確認)
プロファイルの内容を精査
VisualStudioにファイルをドラッグ&ドロップすればプロファイルの内容が確認できます。
まとめ
最適化はちゃんとプロファイル取ってからやりましょう!
Rules of Optimization:
Rule 1: Don't do it.
Rule 2 (for experts only): Don't do it yet.
> Michael A. Jackson. Principles of Program Design, Academic Press, 1975
Tips
-
dotnet-trace
は常に入れておくと急遽必要になった時に焦らないのでお勧め。- セキュリティの関係で
dotnet install
ができないことも多いのであらかじめ仕込んでおくの大事。
- セキュリティの関係で