.NET Core-全局性能诊断工具
前言:
现在.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 进程的列表
  
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>]
参数说明:

示例:收集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 <PID> | 指定从中收集转储的进程的 ID 号。 | 
| -n|--name <name> | 指定从中收集转储的进程的名称。 | 
| --type <Full|Heap|Mini> | 指定转储类型,它确定从进程收集的信息的类型。 有三种类型: | 
| -o|--output <output_dump_path> | 应在其中写入收集的转储的完整路径和文件名。 | 
| --diag | 启用转储收集诊断日志记录。 | 
示例:dotnet-dump collect -p 18832
 
b)dotnet-dump analyze:启动交互式 shell 以了解转储
dotnet-dump analyze <dump_path> [-h|--help] [-c|--command]
示例:dotnet-dump analyze dump_20210509_193133.dmp 进入dmp分析,查看堆栈和未处理异常
   
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 <pid> | 可从中收集 GC 转储的进程 ID。 | 
| -o|--output <gcdump-file-path> | 应写入收集 GC 转储的路径。 默认为 .\YYYYMMDD_HHMMSS_<pid>.gcdump。 | 
| -v|--verbose | 收集 GC 转储时输出日志。 | 
| -t|--timeout <timeout> | 如果收集 GC 转储的时间超过了此秒数,则放弃收集。 默认值为 30。 | 
| -n|--name <name> | 可从中收集 GC 转储的进程的名称。 | 
生成示例:dotnet-gcdump collect -p 18832
  
查看生成文件:使用perfview查看:
  
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诊断跟踪:
  
使用Vs打开生成的跟踪文件如下:
  
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 <symbol server path> | 将符号服务器添加到服务器路径。 | 
| authenticated-server-path <pat> <server path> | 使用个人访问令牌 (PAT) 将经过身份验证的符号服务器添加到服务器路径。 | 
| --cache-directory <file 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 <output directory> | 设置输出目录。 否则,请在输入文件旁边写入(默认)。 | 
| -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
示例:
  
总结:
微软提供了一套强大的诊断工具,熟练的使用这些工具,可以更快更有效的发现程序的运行问题,解决程序的性能问题。
过程中主要使用:counters、dump、trace 工具用于分析.NET Core性能问题。
最近又了解到微软已对这些基础工具已封装了对应包(Microsoft.Diagnostics.NETCore.Client),可以用来开发出自己的有界面的诊断工具。后续将了解实现一个。
参考文档:
https://docs.microsoft.com/zh-cn/dotnet/core/diagnostics/dotnet-counters
https://channel9.msdn.com/Shows/On-NET/Introducing-the-Diagnostics-Client-Library-for-NET-Core
.NET Core-全局性能诊断工具的更多相关文章
- 使用vs自带的性能诊断工具
		visual studio是个强大的集成开发环境,内置了程序性能诊断工具.下面通过两段代码进行介绍. static void Main( string[] args) { Test1(); Test2 ... 
- .NET Core CLI 的性能诊断工具介绍
		前言 开发人员的.NET Core项目上线后,经常会出现各种问题,内存泄漏,CPU 100%,处理时间长等, 这个时候就需要快速并准确的发现问题,并解决问题, 除了项目本身的日志记录外,NET Cor ... 
- MongoDB性能诊断工具
		1. mongostat * dirty 超过20%时阻塞新请求 * used 超过95%时阻塞新请求 * qrw 排队的请求 * conn 连接数量 mongostat:用于了解MongoDB运行状 ... 
- Linux性能诊断工具
		vmstat:虚拟内存状况 –swpd free buff cache si so in cs 參考:http://www.cnblogs.com/ggjucheng/archi ... 
- <JVM下篇:性能监控与调优篇>03-JVM监控及诊断工具-GUI篇
		笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ... 
- <JVM下篇:性能监控与调优篇>01-概述篇-02-JVM监控及诊断工具-命令行篇
		笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ... 
- .NET Core 服务诊断工具
		前言: 前一篇文中介绍了.NET Core-全局性能诊断工具 的使用方法,那么接下来自己实现一个简单.NET Core的诊断工具. 该工具主要包括:.NET Core 程序进程信息查看.性能计数器结果 ... 
- 性能计数器与profiler的组合性能诊断
		性能计数器和sql profiler都是常用的性能诊断工具和优化工具,最近和群友聊天发现很多人竟然不知道这两个可以“组合”使用,所以这篇算是一篇扫盲贴吧. 两种工具简述 通过计数器可以收集两部分内容: ... 
- Linux 性能分析工具汇总合集
		出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章.本文也可以作为检验基础知识的指标,另外文章涵盖了一个系统的方方面面.如果没有完善的计算机系统知识,网络知识和操作系统知识, ... 
随机推荐
- LNMP配置——Nginx配置 —— Nginx解析PHP
			一.配置 #vi /usr/local/nginx/conf/vhost/test.com.conf 写入: server { listen 80; server_name test.com test ... 
- 200-Java语言基础-Java编程入门-006 | Java数组定义及使用(引用数据类型)
			一.数组概述和定义格式说明 为什么要有数组(容器): 为了存储同种数据类型的多个值 数组概念: 数组是存储同一种数据类型多个元素的集合.也可以看成是一个容器. 数组既可以存储基本数据类型,也可以存储引 ... 
- python学习之web中的html基础
			HTML简介及相关标签介绍 首先,我们要了解什么是HTML? HTML被称作超文本标记语言,是一门标记语言,即该语言由各类标记标签组成. 为什么学python要学HTML? 不管学习哪个语言,我们最 ... 
- 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
			题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输 ... 
- 安装JDK9,jemter无法正常启动,怎么退回到JDK8
			安装JDK8,配置环境变量 java -version显示的是8.1 然后安装JDK9之后,java -version显示的是9+8.1 这个时候,无法正常启动jemter 在环境变量中把path的C ... 
- 京东数科面试真题:常见的 IO 模型有哪些?Java 中的 BIO、NIO、AIO 有啥区别?
			本文节选自<Java面试进阶指北 打造个人的技术竞争力> 面试中经常喜欢问的一个问题,因为通过这个问题,面试官可以顺便了解一下你的操作系统的水平. IO 模型这块确实挺难理解的,需要太多计 ... 
- python-类的隐藏和封装
			7 """ 8 封装是面对对象的三大特征之一(另外两个是集成和多态),它指的是将对象> 的信息隐藏在对象的内部,不允许外部程序直接访问对象内部信息,而是通> ... 
- ch1_6_7求解数字排序问题
			import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.Sca ... 
- P1579_哥德巴赫猜想(JAVA语言)
			题目背景 1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于9的奇数都可以表示成3个质数之和.质数是指除了1和本身之外没有其他约数的数,如2和11都是质数,而6不是 ... 
- 学习jQuery(1)
			学习jQuery 通过 jQuery,您可以选取(查询,query) HTML 元素,并对它们执行"操作"(actions). jQuery 语法 jQuery 语法是为 HTML ... 
