622 Views
November 29, 24
スライド概要
2024/11/29 dotnet newのLTの資料です。
NET Profilingの概要と実例に焦点を当てています。プロファイリング技術を用いることで、アプリケーション実行時のコード変更なしに監視が可能になることを説明しています。また、CLR ProfilerやPerfViewなどの実例を紹介し、New Relicエージェントを使用することで特定のメソッドの実行時間を計測する方法や、仮想マシンのメトリクス取得方法を解説しています。プロファイラーの起動方法や、コードの書き換え手法にも触れ、最後に参考資料としていくつかのURLを提供しています。
New Relic株式会社、Technical Support Manager.
マスター タイトルの書式設定 .NET Profiling 2 0 2 4/1 1 /2 9 dotne t new @t ana ka _7 33 1
マスター @tanaka_733 自己紹介 タイトルの書式設定 • New Relic株式会社 テクニカルサポート部部長 • C# Tokyo運営メンバー • Microsoft MVP for Developer Technologies • 最近の趣味 • • • 草ソフトボール ゴルフ ピアノ 2 2
マスター .NET Profilingとは タイトルの書式設定 • アプリケーションのコードを開発者が変更せずに 実行を監視するツール • CLR(共通言語ランタイム)の機能 • 他の言語では(New Relicの場合)… • Javaは比較的似た機能 (-javaagent)で計測 • スクリプト系言語はコードの自動書き換えで計測 • Goでは開発者自身がコードを追加して計測 3 3
マスター .NET Profilingの実例 タイトルの書式設定 • CLR Profiler • https://github.com/microsoftarchive/clrprofiler • PerfView • https://github.com/microsoft/perfview • OpenTelemetry .NET Automatic Instrumentation • https://github.com/open-telemetry/opentelemetry-dotnet-instrumentation • New Relic .NET Agent • https://github.com/newrelic/newrelic-dotnet-agent • 問題を起こすプロファイラーのサンプル • https://jpdscore.github.io/blog/dotnet/common-issues-caused-by-dotnetprofiler/MyNetFxProfiler.zip 4 4
マスター New Relicタイトルの書式設定 Agentに見る、できること • 特定のメソッドの実行時間を計測する • ControllerクラスであればWebの1リクエストあたりの時間 • HttpClientやDBのクラスであれば外部通信の時間 • .NET 仮想マシンのメトリクスを取得する • ログライブラリのAPIに介入して 自動的に構造化したログイベントを記録する • これらの動作をカスタマイズするAPIを提供する • APIはAgentが動作しないときは何もしない(エラーにならない) • 上の「特定のメソッド」を任意に指定できるようにする 5 5
マスター .NET Profilingを有効にするには タイトルの書式設定 • Profiling APIを実装したライブラリ(DLL)を用意する • .NET プロセス起動時に環境変数を設定する • COR_ENABLE_PROFILING もしくは CORECLR_ENABLE_PROFILING • 1を指定するとProfilingを有効にする • COR_PROFILERもしくは CORECLR_PROFILER • プロファイラー固有のGUIDを指定 .NET CLRの制約上、 1つのプロセスに読み込める Profilerは高々1つ • COR_PROFILER_PATHもしくは CORECLR_PROFILER_PATH • プロファイラーのDLLのパスを指定 • .NET Frameworkだとレジストリから検索することも可能らしい 6 6
マスター .NET Profilerの起動の仕組み タイトルの書式設定 • .NET CLRが環境変数を調べて有効になっていれば DLLを見つけてロードする • ロードしたDLLをCOMライブラリとしてインスタンス化 • 指定されたCorProfilerCallbackImplをインスタンス化 • CorProfilerCallbackImpl.Initializeを呼び出す 上のいずれかのプロセスで条件を満たさない(例:S_OKを返さない)と そのProfilerは解除される 7 7
マスター タイトルの書式設定 情報取得 • ICorProfilerCallbackを実装 • Initializeメソッド内で購読したいイベン トに応じて COR_PRF_MONITOR フラ グを設定する • ICorProfilerInfo インターフェース経由 で情報を取得する https://github.com/newrelic/newrelic-dotnetagent/blob/v10.34.0/src/Agent/NewRelic/Profiler/Profiler/ CorProfilerCallbackImpl.h#L874-L875 参考資料[1] より引用 8 8
マスター .NET Profilerでコードを書き換える タイトルの書式設定 • イベントが発生しJITCompilationStartedコールバックを受け取る • 対象のメソッドをチェックし書き換えるかどうか判定する • 書き換える場合、reJITを要求する • reJITが開始されるとイベントが発生しコールバックを受け取る • 元のメソッドをJITコンパイル結果したバイトコードを取得する • 書き換えたいコードに変換する • New Relicの場合、計測するためのコードでラップする • 変換後のコードをJITコンパイルしたバイトコードをCLRに伝える 9 9
マスター タイトルの書式設定 参考資料 • [1] プロファイリングの概要 • https://learn.microsoft.com/ja-jp/dotnet/framework/unmanaged-api/profiling/profilingoverview?WT.mc_id=AZ-MVP-5000211 • [2] .NET Framework のプロファイル機能を利用する製品に起因する一般的な問題につい て • https://jpdscore.github.io/blog/dotnet/common-issues-caused-by-dotnet-profiler/ • [3] Start a journey into the .NET Profiling APIs • https://chnasarre.medium.com/start-a-journey-into-the-net-profiling-apis-40c76e2e36cc • [4] NewRelic Profiler README • https://github.com/newrelic/newrelic-dotnetagent/blob/main/src/Agent/NewRelic/Profiler/README.md 10 10