推荐学习:ASP.NET Core 全局性能诊断工具
共 6857字,需浏览 14分钟
·
2021-10-30 15:38
前言
现在.NET Core 上线后,不可避免的会出现各种问题,如内存泄漏、CPU占用高、接口处理耗时较长等问题。这个时候就需要快速准确的定位问题,并解决。
这时候就可以使用.NET Core 为开发人员提供了一系列功能强大的诊断工具。
接下来就详细了解下:.NET Core 全局诊断工具
dotnet-counters dotnet-dump dotnet-gcdump dotnet-trace dotnet-symbol dotnet-sos
1、dotnet-counters
简介
dotnet-counters 是一个性能监视工具,用于初级运行状况监视和性能调查。它通过 EventCounter API 观察已发布的性能计数器值。例如,可以快速监视CUP使用情况或.NET Core 应用程序中的异常率等指标
安装
通过nuget包安装:
dotnet tool install --global dotnet-counters
主要命令
dotnet-counters ps dotnet-counters list dotnet-counters collect dotnet-counters monitor
a)dotnet-counters ps:显示可监视的 dotnet 进程的列表
![](https://filescdn.proginn.com/63ed645551dac9375245403e5c1ba7b7/45b350b7b8863da1fd96bc14236aaa32.webp)
b)dotnet-counters list命令:显示按提供程序分组的计数器名称和说明的列表
包括:运行时和Web主机运行信息
c)dotnet-counters collect 命令:定期收集所选计数器的值,并将它们导出为指定的文件格式
dotnet-counters collect [-h|--help] [-p|--process-id] [-n|--name] [--diagnostic-port] [--refresh-interval] [--counters <COUNTERS>] [--format] [-o|--output] [-- <command>]
参数说明:
![](https://filescdn.proginn.com/5e9606f431a0ce2bee585a195178157a/d92dc8813d4c95053983d85f2cec6de4.webp)
示例:收集dotnet core 服务端所有性能计数器值,间隔时间为3s
d)dotnet-counters monitor命令:显示所选计数器的定期刷新值
dotnet-counters monitor [-h|--help] [-p|--process-id] [-n|--name] [--diagnostic-port] [--refresh-interval] [--counters] [-- <command>]
示例:dotnet-counters monitor --process-id 18832 --refresh-interval 2
2、dotnet-dump
简介
通过 dotnet-dump 工具,可在不使用本机调试器的情况下收集和分析 Windows 和 Linux 核心转储。
安装
dotnet tool install --global dotnet-dump
命令
dotnet-dump collect dotnet-dump analyze
a) dotnet-dump collect:从进程生成dump
dotnet-dump collect [-h|--help] [-p|--process-id] [-n|--name] [--type] [-o|--output] [--diag]
参数说明:
-h|--help | 显示命令行帮助。 |
-p|--process-id | 指定从中收集转储的进程的 ID 号。 |
-n|--name | 指定从中收集转储的进程的名称。 |
--type <Full|Heap|Mini> | 指定转储类型,它确定从进程收集的信息的类型。有三种类型:Full - 最大的转储,包含所有内存(包括模块映像)。Heap - 大型且相对全面的转储,其中包含模块列表、线程列表、所有堆栈、异常信息、句柄信息和除映射图像以外的所有内存。Mini - 小型转储,其中包含模块列表、线程列表、异常信息和所有堆栈 |
-o|--output <output_dump_path> | 应在其中写入收集的转储的完整路径和文件名。如果未指定:在 Windows 上默认为 .\dump_YYYYMMDD_HHMMSS.dmp 。在 Linux 上默认为 ./core_YYYYMMDD_HHMMSS 。YYYYMMDD 为年/月/日,HHMMSS 为小时/分钟/秒。 |
--diag | 启用转储收集诊断日志记录。 |
示例
dotnet-dump collect -p 18832
![](https://filescdn.proginn.com/707163aeea7bd5cfb3c8772c73394677/89dc6e52a16fc2c6e9126dd39e84838a.webp)
b)dotnet-dump analyze:启动交互式 shell 以了解转储
dotnet-dump analyze <dump_path> [-h|--help] [-c|--command]
示例:dotnet-dump analyze dump_20210509_193133.dmp 进入dmp分析,查看堆栈和未处理异常
![](https://filescdn.proginn.com/fae699e929e3acb64ea4be267ae86374/1029a877a3314759f06611a0c2c29337.webp)
Sos命令列表:
命令 | 函数 |
---|---|
soshelp | 显示所有可用命令 |
soshelp|help <command> | 执行指定的命令。 |
exit|quit | 退出交互模式。 |
clrstack <arguments> | 仅提供托管代码的堆栈跟踪。 |
clrthreads <arguments> | 列出正在运行的托管线程。 |
dumpasync <arguments> | 显示有关垃圾回收堆上异步状态机的信息。 |
dumpassembly <arguments> | 显示有关指定地址处程序集的详细信息。 |
dumpclass <arguments> | 显示有关指定地址处的 EEClass 结构的信息。 |
dumpdelegate <arguments> | 显示有关指定地址处的委托的信息。 |
dumpdomain <arguments> | 显示所有 AppDomain 和指定域中的所有程序集的信息。 |
dumpheap <arguments> | 显示有关垃圾回收堆的信息和有关对象的收集统计信息。 |
dumpil <arguments> | 显示与托管方法关联的 Microsoft 中间语言 (MSIL)。 |
dumplog <arguments> | 将内存中压力日志的内容写入到指定文件。 |
dumpmd <arguments> | 显示有关指定地址处的 MethodDesc 结构的信息。 |
dumpmodule <arguments> | 显示有关指定地址处的模块的信息。 |
dumpmt <arguments> | 显示有关指定地址处的 MethodTable 的信息。 |
dumpobj <arguments> | 显示有关位于指定地址处的对象的信息。 |
dso|dumpstackobjects <arguments> | 显示在当前堆栈的边界内找到的所有托管对象。 |
eeheap <arguments> | 显示有关内部运行时数据结构所使用的进程内存的信息。 |
finalizequeue <arguments> | 显示所有已进行终结注册的对象。 |
gcroot <arguments> | 显示有关对指定地址处的对象的引用(或根)的信息。 |
gcwhere <arguments> | 显示传入参数在 GC 堆中的位置。 |
ip2md <arguments> | 显示 JIT 代码中指定地址处的 MethodDesc 结构。 |
histclear <arguments> | 释放由 hist* 命令系列使用的任何资源。 |
histinit <arguments> | 从保存在调试对象中的压力日志初始化 SOS 结构。 |
histobj <arguments> | 显示与 <arguments> 相关的垃圾回收压力日志重定位。 |
histobjfind <arguments> | 显示在指定地址处引用对象的所有日志项。 |
histroot <arguments> | 显示与指定根的提升和重定位相关的信息。 |
lm|modules | 显示进程中的本机模块。 |
name2ee <arguments> | 显示 <argument> 的 MethodTable 和 EEClass 结构。 |
pe|printexception <arguments> | 显示从 Exception 类派生的 <argument> 的任何对象。 |
setsymbolserver <arguments> | 启用符号服务器支持 |
syncblk <arguments> | 显示 SyncBlock 持有者信息。 |
threads|setthread <threadid> | 设置或显示 SOS 命令的当前线程 ID。 |
3、dotnet-gcdump
简介
dotnet-gcdump 工具可用于为活动 .NET 进程收集 GC(垃圾回收器)转储。
dotnet-gcdump
全局工具使用 EventPipe 收集实时 .NET 进程的 GC(垃圾回收器)转储。创建 GC 转储时需要在目标进程中触发 GC、开启特殊事件并从事件流中重新生成对象根图。此过程允许在进程运行时以最小的开销收集 GC 转储。
这些转储对于以下几种情况非常有用:
比较多个时间点堆上的对象数。 分析对象的根(回答诸如“还有哪些引用此类型的内容?”等问题)。 收集有关堆上的对象计数的常规统计信息。
安装:
dotnet tool install --global dotnet-gcdump
示例:从当前正在运行的进程中收集 GC 转储
dotnet-gcdump collect [-h|--help] [-p|--process-id <pid>] [-o|--output <gcdump-file-path>] [-v|--verbose] [-t|--timeout <timeout>] [-n|--name <name>]
参数说明:
参数 | 说明: |
---|---|
-h|--help | 显示命令行帮助。 |
-p|--process-id | 可从中收集 GC 转储的进程 ID。 |
-o|--output | 应写入收集 GC 转储的路径。默认为 .\YYYYMMDD_HHMMSS_ |
-v|--verbose | 收集 GC 转储时输出日志。 |
-t|--timeout | 如果收集 GC 转储的时间超过了此秒数,则放弃收集。默认值为 30。 |
-n|--name | 可从中收集 GC 转储的进程的名称。 |
生成示例:dotnet-gcdump collect -p 18832
![](https://filescdn.proginn.com/9d49967973b31cef1d5f5dc3edaeabad/87b32e6cb3664dfd000ecfa2aadc284d.webp)
查看生成文件:使用perfview查看:
![](https://filescdn.proginn.com/e0e88959e904577cf587b3d5976a7166/574b8cf8a99dd676945746e2d6aa7652.webp)
4、dotnet-trace
简介
分析数据通过 .NET Core 中的 EventPipe
公开。通过 dotnet-trace 工具,可以使用来自应用的有意思的分析数据,这些数据可帮助你分析应用运行缓慢的根本原因。
安装
dotnet tool install --global dotnet-trace
命令
dotnet-trace [-h, --help] [--version] <command>
常用命令
命令 | 说明 |
---|---|
dotnet-trace collect | 从正在运行的进程中收集诊断跟踪,或者启动子进程并对其进行跟踪(仅限 .NET 5+)。若要让工具运行子进程并自其启动时对其进行跟踪,请将 -- 追加到 collect 命令。 |
dotnet-trace convert | 将 nettrace 跟踪转换为备用格式,以便用于备用跟踪分析工具。 |
dotnet-trace ps | 列出可从中收集跟踪的 dotnet 进程。 |
dotnet-trace list-profiles | 列出预生成的跟踪配置文件,并描述每个配置文件中包含的提供程序和筛选器。 |
示例
收集进程18832诊断跟踪:
![](https://filescdn.proginn.com/e8e9e6f1608a0b7d0d1ec37522056748/daf3a2c4dd8086cd6d5f6889f1d91b44.webp)
使用Vs打开生成的跟踪文件如下:
![](https://filescdn.proginn.com/a9a5430acc838f028a3e795f48dfae32/6fabd007ff44efdbbb7c9c7c11481b4f.webp)
5、dotnet-symbol
简介
dotnet-symbol 用于下载打开核心转储或小型转储所需的文件(符号、DAC/DBI、主机文件等)。如果需要使用符号和模块来调试在其他计算机上捕获的转储文件,请使用此工具。
安装
dotnet tool install --global dotnet-symbol
命令
dotnet-symbol [-h|--help] [options] <FILES>
options
参数 | 说明 |
---|---|
--microsoft-symbol-server | 添加“http://msdl.microsoft.com/download/symbols”符号服务器路径(默认)。 |
--server-path | 将符号服务器添加到服务器路径。 |
authenticated-server-path | 使用个人访问令牌 (PAT) 将经过身份验证的符号服务器添加到服务器路径。 |
--cache-directory | 添加缓存目录。 |
--recurse-subdirectories | 处理所有子目录中的输入文件。 |
--host-only | 仅下载 lldb 加载核心转储所需的主机程序(即 dotnet)。 |
--symbols | 下载符号文件(.pdb、.dbg 和 .dwarf)。 |
--modules | 下载模块文件(.dll、.so 和 .dylib)。 |
--debugging | 下载特殊的调试模块(DAC、DBI 和 SOS)。 |
--windows-pdbs | 当可移植的 PDB 也可用时,会强制下载 Windows PDB。 |
-o, --output | 设置输出目录。否则,请在输入文件旁边写入(默认)。 |
-d, --diagnostics | 启用诊断输出。 |
-h|--help | 显示命令行帮助。 |
6、dotnet-sos
简介
dotnet-sos 在 Linux 和 macOS(如果使用的是 Windbg/cdb,则在 Windows 上)安装 SOS调试扩展。
安装
dotnet tool install --global dotnet-sos
命令
在本地安装用于调试 .NET Core 进程的 SOS 扩展
dotnet-sos install
示例
![](https://filescdn.proginn.com/8ac0dded65d3a03d5d3ced5076b99dda/e64b58b6fe6d4d3c90452bbc15e22fa4.webp)
总结
微软提供了一套强大的诊断工具,熟练的使用这些工具,可以更快更有效的发现程序的运行问题,解决程序的性能问题。
过程中主要使用:counters、dump、trace 工具用于分析.NET Core性能问题。
最近又了解到微软已对这些基础工具已封装了对应包(Microsoft.Diagnostics.NETCore.Client),可以用来开发出自己的有界面的诊断工具。后续将了解实现一个。
转自:chaney1992
链接:cnblogs.com/cwsheng/p/14748477.html
![](https://filescdn.proginn.com/6cd83c39d81d444ad04da83ef76f3462/0f7f315872a17dfe7d59a7c5d6d5c3b4.webp)
![](https://filescdn.proginn.com/b1440f4917809213ad0b587fec00cc0b/2b34aaa629593d10a9548ddc43e4755a.webp)
强烈推荐:超全C#帮助类,提升效率就靠它
![](https://filescdn.proginn.com/7801a2c71eadb6b97b9035687a638125/e4371e3be4efcbb8f312dbca70d9506b.webp)
去TM收费,我要在线 Vip 视频解析!