dotnet诊断工具记录

CPU爆高(cpu陡增,比如正常运行一般是x%的cpu,突然到了20% 30%甚至更高)

调试高 CPU 使用率

dotnet tool install --global dotnet-counters
和dotnet-trace配合使用收集dotnet程序信息,参见https://docs.microsoft.com/zh-cn/dotnet/core/diagnostics/debug-highcpu?tabs=windows
dotnet-trace ps # 获取pid
dotnet-counters monitor --refresh-interval 1 -p 22884 # 监视CPU使用率
dotnet-trace collect -p 22884 --providers Microsoft-DotNETCore-SampleProfiler  # --providers 是指定了所需的提供程序,是微软提供的应用程序,也可以不写
上一步收集,将收集.nettrace文件,可以使用vs 2022直接打开或者PerfView打开(推荐vs 2022)
打开后将会展示出CPU占比,自己忽略掉system等系统路径,查看到自己的代码路径,然后定位具体方法

内存泄漏(内存飙高或者出现oom)

调试内存泄露

dotnet tool install --global dotnet-dump # dotnet-counters 和 dotnet-dump 结合使用,也可以不进行监视,直接收集转储文件
dotnet-counters monitor --refresh-interval 1 -p 4807 # 查看GC Heap Size (MB) 这一行 ,可以忽略
dotnet-dump collect -p 4807 # 收集转储文件
dotnet-dump analyze core_20190430_185145 # 加载转储的文件
dumpheap -stat # 查看托管堆的整体状态,找到最后几行,给出的结果会按照从小到大排序,所以不用再往上面翻了
结果有四列 MT、Count、TotalSize、Class Name,查看TotalSize和Count最大的几个,然后用MT来做下一步
dumpheap -mt 00007faddaa50f90 # 查看当前MT对应的Class Name列表
输出结果Address、MT、Size ,然后用Address来做下一步
对Class Name实例使用 gcroot 命令,以查看对象的根方式和原因
gcroot -all 00007f6ad09421f8 # 可以将上一步的Address多查看几个,特别是size不同的,以免漏掉一些内存泄漏的地方
查看最后输出的HandleTable内容,一般就是自己所要查看内存泄漏的堆栈信息

死锁(无响应或线程累积问题)

调试 .NET Core 中的死锁

dotnet-dump collect -p 4807
dotnet-dump analyze  ~/.dotnet/tools/core_20190513_143916
threads # 如果确定已经线程飙高了,这句话可以不执行
clrstack -all # 如果确定已经线程飙高了,这句话可以不执行
syncblk # 找出实际持有监视器锁定的线程

将会出现类似于下面这种的输出,其中查看Thread这一列,对齐可以有问题,自己要看好Thread指的是死锁所在的线程ID

`
Index SyncBlock MonitorHeld Recursion Owning Thread Info SyncBlock Owner
43 00000246E51268B8 603 1 0000024B713F4E30 5634 28 00000249654b14c0 System.Object
44 00000246E5126908 3 1 0000024B713F47E0 51d4 29 00000249654b14d8 System.Object

Original: https://www.cnblogs.com/spatxos/p/16664334.html
Author: spatxos
Title: dotnet诊断工具记录

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/582898/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • redis编译安装

    redis是一个强大的NoSQL数据库,相对于memcached,他提供了更丰富的数据类型,有string、hash、list、set、sorted set这几种类型;还支持数据持…

    Linux 2023年5月28日
    097
  • Ubuntu18.04安装/卸载NVIDIA显卡驱动

    1 显卡驱动下载 官网:NVIDIA 搜索适合本机的驱动 获取最新版本驱动 立即下载 文件 上面,显卡驱动程序下载已完成。 [En] Above, the video card d…

    Linux 2023年5月27日
    0222
  • 5.9 Linux Vim批量注释和自定义注释

    使用 Vim 编辑 Shell 脚本,在进行调试时,需要进行多行的注释,每次都要先切换到输入模式,在行首输入注释符 #再退回命令模式,非常麻烦。 连续行的注释其实可以用替换命令来完…

    Linux 2023年6月7日
    087
  • Redis缓存三大问题解析,看完保你面试能造火箭,工作能拧螺丝。

    前言 日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题。 面试10家公司,收获9个offer,2020年…

    Linux 2023年5月28日
    086
  • haproxy-详解

    四层: LVS (Linux Virtual Server)HAProxy (High Availability Proxy)Nginx (1.9以上) 七层: HAProxyNg…

    Linux 2023年6月14日
    085
  • Golang 实现 Redis(10): 本地原子性事务

    为了支持多个命令的原子性执行 Redis 提供了事务机制。 Redis 官方文档中称事务带有以下两个重要的保证: 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行…

    Linux 2023年5月28日
    098
  • Android so(ELF)文件解析

    一、前言 so文件是啥?so文件是elf文件,elf文件后缀名是 .so ,所以也被chang常称之为 so文件,elf文件是linux…

    Linux 2023年6月8日
    096
  • 如何提高团队开发质量

    年轻的时候去面过一个相对于当时我的比较高端的管理岗位,当时的我情况是,开发经验相对丰富, 但管理经验还欠缺。对方当时面临一个具体的问题。 “我们最近生产上,出现了一个比…

    Linux 2023年6月13日
    074
  • c++ 11 是如何简化你的数据库访问接口的

    之前写过一篇文章专门分析了 c++ 模板编译过程中报的一个错误:《fatal error C1045: 编译器限制 : 链接规范嵌套太深 》,其中涉及到了 qtl —— 一个使用 …

    Linux 2023年6月6日
    094
  • mysql字符串拼接

    Mysql数据库中的字符串 CONCAT()CONCAT_WS()GROUP_CONCAT() CONCAT() CONCAT(string1,string2)最常用的字符串拼接方…

    Linux 2023年6月6日
    069
  • Centos部署Loki日志聚合系统

    有关一些日志聚合的起源和原则,请参阅我的另一篇文章“用于编程入门的日志聚合系统”。 [En] For the origin and principles of some log a…

    Linux 2023年5月27日
    067
  • linux DMA接口

    1.1. 一致性DMA映射(Consistent DMA mappings ) 主要用于映射长时间使用的区域。 CPU和DMA controller不需要考虑cache的影响。 1…

    Linux 2023年6月6日
    059
  • Windows针对子目录共享权限控制

    Windows的共享文件设置有两种,一种是共享这一个目录然后里面的子文件,文件夹权限则集成;一种是共享这个目录后,里面的子文件与文件夹权限可单独控制。 共享一 image-2021…

    Linux 2023年6月8日
    093
  • WPF 推荐一个剪贴板内容查看工具

    本文来安利大家一个好用的 Windows 剪贴板的内容查看工具 这是在 GitHub 上完全免费开源的应用,由 walterlv 开发的应用,详细请看 https://github…

    Linux 2023年6月6日
    0119
  • js笔记之while循环

    while循环就是for循环去掉前后两个条件 var i = 0; for( ; i < 10; ){ document.write(i); document.write(&…

    Linux 2023年6月13日
    096
  • 一键安装Cisco AnyConnect Secure Mobility Client

    Mac版本 背景:公司内部安装此VPN软件的时候,因默认是安装了所有模块,但我们只需要vpn模块,所产生的干扰。并且有人因不熟悉Mac pkg 软件的卸载方法导致非正常卸载,导致重…

    Linux 2023年6月8日
    095
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球