译 | .NET Core 3.0 对诊断的改进
原文:Sourabh Shirhatti
翻譯:Edi Wang
在 .NET Core 3.0 中,我們將引入一套工具,這些工具利用 .NET 運行時中的新功能,使診斷和解決性能問題變得更加容易。
這些運行時功能可幫助您回答一些常見的診斷問題:
我的應用程序是否正常?
為什么我的應用程序有異常行為?
為什么我的應用程序崩潰?
我的應用程序是否正常?
通常,應用程序可能會緩慢地開始泄漏內存,并最終導致內存不足異常。其他時候,某些有問題的代碼路徑可能會導致 CPU 利用率激增。這些只是您可以主動根據 Metrics(指標)識別出的一類問題。
Metrics(指標)
指標是時間間隔內數據度量的表示形式。指標(或時間序列)數據允許您在高級別上觀察系統的狀態。與 Windows 上的 .NET Framework不同,.NET Core不會產生 perf 計數器。相反,我們引入了一種通過EventCounter API 在 .NET Core 中發出指標的新方法。
EventCounter提供了對 Windows perf 計數器的改進,因為這些計數器現在可用于支持 .NET Core 的所有操作系統。此外,與 perf 計數器不同,它們也可用于低特權環境 (如 xcopy 部署) 。遺憾的是,缺少性能監視器 (perfmon) 這樣的工具,因此很難實時使用這些指標。
dotnet-counters
在 3.0-preview5 中,我們將引入一種新的命令行工具,用于實時觀察 .NET Core應用程序發出的指標。
您可以通過運行以下命令來安裝此 .NET 全局工具。
dotnet tool install --global dotnet-counters --version 1.0.3-preview5.19251.2
在下面的示例中,我們看到當我們將負載生成器指向 Web 應用程序時,應用程序的 CPU 利用率和工作集內存跳轉。
(譯者注:由于平臺限制,無法嵌入視頻,請閱讀原文查看以上工具的屏幕錄像)
有關如何使用此工具的詳細說明,請查看 dotnet-counter readme?(https://github.com/dotnet/diagnostics/blob/master/documentation/dotnet-counters-instructions.md)。
有關dotnet-counter的已知限制,請查看 GitHub 上的未解決的問題(https://github.com/dotnet/diagnostics/issues?q=is%3Aopen+is%3Aissue+label%3Adotnet-counters)。
為什么我的應用程序有異常行為?
雖然指標有助于識別異常行為的發生,但它們對出錯的原因幾乎無法了解。要回答應用程序為何出現異常行為的問題,您需要通過跟蹤(traces)收集其他信息。例如,通過跟蹤收集的 CPU 配置文件可以幫助您識別代碼中的熱點路徑。
Tracing (跟蹤)
跟蹤是不可變離散事件的時戳記錄。跟蹤包含本地上下文,允許您更好地推斷系統的命運。傳統上,.NET Framework (以及ASP.NET等框架)通過 Windows 事件跟蹤 (ETW) 發出有關其內部的診斷跟蹤。在 .NET Core中,這些跟蹤寫入了 Windows 上的 ETW 和 Linux 上的 LTTng。
dotnet-trace
在 3.0-preview5 中,每個 .NET Core 應用程序都會打開一個名為 EventPipe 的雙工管道(Windows 上的Unix域套接字*nix/named管道),它可以在其上發出事件。當我們仍在研究控制器協議時,dotnet-trace實現了此協議的預覽版本。
您可以通過運行以下命令來安裝此 .NET 全局工具:
dotnet tool install --global dotnet-trace--version 1.0.3-preview5.19251.2
(譯者注:由于平臺限制,無法嵌入視頻,請閱讀原文查看以上工具的屏幕錄像)
在上面的示例中,我使用啟用 CPU 探查器事件和 .NET 運行時事件的默認配置文件運行 dotnet-trace。
除了默認事件之外,還可以根據嘗試執行的調查啟用其他提供程序。
因為運行了 dotnet-trace,您會得到一個 .netperf 文件。此文件包含運行時事件和可按視圖可視化的采樣 CPU 堆棧。Visual Studio (16.1) 的下一次更新還將添加對這些跟蹤可視化的支持。
如果在捕獲跟蹤時在 OS X 或 Linux 上運行,則可以選擇將這些 .netperf 文件轉換為 .speedscope.json 文件,這些文件可以通過 Speedscope.app 進行可視化。
您可以通過運行以下命令來轉換現有跟蹤文件:
dotnet trace convert <input-netperf-file>
下面的冰柱圖可視化了我們剛剛在speedscope里捕獲的追蹤:
有關如何使用此工具的詳細說明,請查看 dotnet-trace readme(https://github.com/dotnet/diagnostics/blob/master/documentation/dotnet-trace-instructions.md)。有關dotnet-trace的已知限制,請查看 GitHub 上的未解決問題(https://github.com/dotnet/diagnostics/issues?q=is%3Aopen+is%3Aissue+label%3Adotnet-trace)。
為什么我的應用程序會爆?
在某些情況下,僅通過跟蹤進程就無法確定導致異常行為的原因。如果進程崩潰或可能需要更多信息(如訪問整個流程堆)的情況,則進程轉儲可能更適合分析。
轉儲分析(Dump Analysis)
轉儲是進程意外終止時通常捕獲的進程的工作虛擬內存狀態的記錄。診斷核心轉儲文件通常用于識別應用程序崩潰或意外行為的原因。
傳統上,您依靠操作系統在應用程序崩潰(例如Windows 錯誤報告)時捕獲轉儲,或者使用 procdump 等工具在滿足某些觸發條件時捕獲轉儲。
到目前為止,在 Linux 上使用 .NET 捕獲轉儲的挑戰是使用 gcore 或調試器捕獲轉儲,導致轉儲非常大,因為現有工具不知道在 .NET Core 進程中要修剪哪些虛擬內存頁。
此外,即使收集了這些轉儲,也難以分析這些轉儲,因為它需要獲取調試器并將其配置為加載 sos,這是 .NET 的調試器擴展。
dotnet-dump
3.0.0-preview5中,我們引入了一個新的工具,允許您捕獲和分析 Windows 和 Linux 上的進程轉儲。
dotnet-dump 仍處于活躍開發狀態,下表顯示了當前在哪些操作系統上支持的功能。
您可以通過運行以下命令來安裝此 .NET 全局工具:
dotnet tool install --global dotnet-dump --version 1.0.3-preview5.19251.2
安裝 dotnet-dump后,可以通過運行以下命令來捕獲進程轉儲:
sudo $HOME/.dotnet/tools/dotnet-dump collect -p <pid>
在 Linux 上,可以通過運行以下命令加載生成的轉儲來分析生成的轉儲:
dotnet dump analyze <dump-name>
在下面的示例中,我嘗試通過遍歷堆來確定已崩潰轉儲ASP.NET Core托管環境。
(譯者注:由于平臺限制,無法嵌入視頻,請閱讀原文查看以上工具的屏幕錄像)
結尾
感謝您在 .NET Core 3.0 中嘗試新的診斷工具。請繼續向我們提供反饋,無論是在評論中還是在 GitHub 上。我們正在認真傾聽,并將繼續根據您的反饋進行更改。
總結
以上是生活随笔為你收集整理的译 | .NET Core 3.0 对诊断的改进的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET中扩展方法和Enumerable
- 下一篇: 设计模式之策略者模式