记一次 .NET 某工控数据采集平台 线程数 爆高分析

一:背景

1. 讲故事

前几天有位朋友在 B站 加到我,说他的程序出现了 线程数 爆高的问题,让我帮忙看一下怎么回事,截图如下:

记一次 .NET 某工控数据采集平台 线程数 爆高分析

说来也奇怪,这些天碰到了好几起关于线程数无缘无故的爆高,不过那几个问题比这一篇要复杂的多,主要涉及到非托管层面,分享这一篇的目的主要是它很有代表性,很有必要。

闲话不多说,既然线程数爆高,那就上 windbg 说话。

二:WinDbg 分析

1. 线程数真的高吗

既然说线程数高,那到底有多少呢? 我们可以用 !t 命令看一下。


0:000> !t
ThreadCount:      109
UnstartedThread:  0
BackgroundThread: 104
PendingThread:    0
DeadThread:       1
Hosted Runtime:   no
                                                                         Lock
       ID OSID ThreadOBJ    State GC Mode     GC Alloc Context  Domain   Count Apt Exception
   0    1 2970 00581020     26020 Preemptive  0294AE60:00000000 0057a5f0 0     STA
   2    2 1d2c 00590670     2b220 Preemptive  00000000:00000000 0057a5f0 0     MTA (Finalizer)
   5    4 3388 0063a9b8   102a220 Preemptive  00000000:00000000 0057a5f0 0     MTA (Threadpool Worker)
   6    5 265c 0063b458   1020220 Preemptive  00000000:00000000 0057a5f0 0     Ukn (Threadpool Worker)
   7    7 3370 07100fa8   202b220 Preemptive  00000000:00000000 0057a5f0 0     MTA
 ...

 113   41 4af4 0a85a490   8029220 Preemptive  0294F918:00000000 0057a5f0 0     MTA (Threadpool Completion Port)
 114   75 4b9c 0a83d818   8029220 Preemptive  00000000:00000000 0057a5f0 0     MTA (Threadpool Completion Port)
 115   76 4ba0 0a83d2d0   8029220 Preemptive  02B53AC4:00000000 0057a5f0 0     MTA (Threadpool Completion Port)

从卦象看,当前有 115 个托管线程,从主线程的 STA 模式看 应该是一个 WinForm/WPF 程序,桌面程序这个线程数说多也不多,说少也不少,下一步的思路就是看下这些线程都在做什么。

2. 这些线程都在做什么

要探究每个线程都在做什么,可以用 ~*e !clrstack 调出所有线程栈,然后仔细耐心的观察这些线程。


0:000> ~*e !clrstack
OS Thread Id: 0x488c (109)
Child SP       IP Call Site
114de760 7704018d [GCFrame: 114de760]
114de90c 7704018d [GCFrame: 114de90c]
114de8bc 7704018d [HelperMethodFrame: 114de8bc] System.Threading.Monitor.ReliableEnter(System.Object, Boolean ByRef)
114de94c 6dfe2767 System.Threading.Monitor.Enter(System.Object, Boolean ByRef)
114de95c 056107e3 CSRedis.Internal.IO.RedisIO.Write(Byte[])
114de998 05cb338c CSRedis.Internal.RedisConnector.Write(CSRedis.RedisCommand)
114de9dc 05cb32fc CSRedis.Internal.RedisListener1[[System.__Canon, mscorlib]].Write[[System.__Canon, mscorlib]](CSRedis.RedisCommand1)
114de9f0 05cb3263 CSRedis.Internal.SubscriptionListener.Send(CSRedis.Internal.Commands.RedisSubscription)
114dea0c 050c4ffd CSRedis.RedisClient.Unsubscribe(System.String[])
114dea24 050c01e3 CSRedis.CSRedisClient+SubscribeObject+c__DisplayClass13_0.b__1(System.Object)
114deab4 6e026471 System.Threading.TimerQueueTimer.CallCallbackInContext(System.Object)
114deab8 6dfe2925 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
114deb24 6dfe2836 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
114deb38 6e026377 System.Threading.TimerQueueTimer.CallCallback()
114deb6c 6e0261fe System.Threading.TimerQueueTimer.Fire()
114debac 6e02612f System.Threading.TimerQueue.FireNextTimers()
114debec 6e025ff1 System.Threading.TimerQueue.AppDomainTimerCallback()
114dee10 6f38eaf6 [DebuggerU2MCatchHandlerFrame: 114dee10]
...

记一次 .NET 某工控数据采集平台 线程数 爆高分析

从卦象看,线程特征非常明显,有 86 个线程卡在 Monitor.ReliableEnter 处,它就是我们C#中的 监视锁 ,既然是监视锁,那就好办了,查看它的 同步块表,看看谁在 lock 里赖着不出来导致其他线程等待,使用 windbg 的 !syncblk 命令。

`c#

0:000> !syncblk
Index SyncBlock MonitorHeld Recursion Owning Thread Info SyncBlock Owner
72 005ef1f0 87 1 07176838 12c8 13 028374e4 System.Object
75 005efd1c 87 1 07176d80 32c0 14 028368ec System.Object

Original: https://www.cnblogs.com/huangxincheng/p/16443889.html
Author: 一线码农
Title: 记一次 .NET 某工控数据采集平台 线程数 爆高分析

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

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

(0)

大家都在看

  • Java基础 | Stream流原理与用法总结

    Stream简化元素计算; 一、接口设计 从Java1.8开始提出了Stream流的概念,侧重对于源数据计算能力的封装,并且支持序列与并行两种操作方式;依旧先看核心接口的设计: B…

    Java 2023年6月15日
    095
  • TODO NAVIGATOR

    1.网址导航 地址 分类 备注基于 Flink+Hive 构建流批一体准实时数仓 Data拜托,面试请不要再问我Redis分布式锁的实现原理【石杉的架构笔记】 秒杀系统 3种Red…

    Java 2023年6月5日
    081
  • docker入门教程

    docker入门 1、简介 官网 :https://www.docker.com/ 官网文档:https://docs.docker.com/ 官网镜像:https://hub.d…

    Java 2023年6月5日
    0116
  • 聊天软件的后端架构NIO

    聊天软件等的技术,朋友圈,钉钉,微博分两种技术模式:1.读扩散:也就是拉模式消息会存储到自己的发件箱里面,然后让每个上线的人去拉取未读消息,缺点是每次都要去好多底线去拉取数据,读操…

    Java 2023年6月14日
    069
  • 自动备份一个TXT文件里面的SVN库

    之前的项目都是使用SVN进行代码管理,万一SVN挂了,,,项目全部爆炸,,,所以定时备份还是有必要的,,,虽然现在都不用SVN了,,,记录一下自己的备份方法 Original: h…

    Java 2023年6月15日
    063
  • mybatis oracle批量插入保存

    1:XML脚本 <insert id="importExcel"> insert all <foreach collection="…

    Java 2023年5月30日
    082
  • Jenkins 强制停止 job 执行

    0.背景 某天,Jenkins 运维支持群里,有同学反馈说,点击 job 页面的取消执行按钮不生效,job 执行停不下来。 收到这个反馈后,我自己也试了下,发现确实点页面取消按钮不…

    Java 2023年6月9日
    0112
  • 面试题详解:如何用Redis实现分布式锁?

    说一道常见面试题: 使用Redis分布式锁的详细方案是什么? 一个很简单的答案就是去使用 Redission 客户端。Redission 中的锁方案就是 Redis 分布式锁的比较…

    Java 2023年6月7日
    097
  • StackOverFlow & OutOfMemory

    StackOverFlow & OutOfMemory 两者都为 Error,广义上的”异常” StackOverflow 通常为 Java 虚拟机…

    Java 2023年6月5日
    098
  • Java开发手册精华总结

    阿里 Java 开发手册的思考总结 一个优秀的工程师和一个普通的工程师的区别,不是满天飞的架构图,他的功底体现在所写的每一行代码上。— 毕玄 1. 命名风格 【书摘】类…

    Java 2023年5月29日
    092
  • 美团动态线程池实践思路,开源了(二)

    大家好,动态线程池项目DynamicTp开源一个多月,目前400多star,说明还是比较受欢迎的,现在已经有一些小伙伴在接入使用或者即将接入使用了,为了项目以后更好的发展迭代,打算…

    Java 2023年6月14日
    0129
  • Word书签替换,加盖电子印章及转换PDF(Java实用版)

    一、前言 在项目中有需要对word进行操作的,可以看看哈,本次使用比较强大的spire组件来对word进行操作,免费版支持三页哦,对于不止三页的word文件,可以购买收费版,官网:…

    Java 2023年6月8日
    092
  • 三,手写SpringMVC框架,第三次改进

    1 . 解决跳转问题:添加一个 login 方法,跳转返回一个字符串。 中央控制器DispacherServlet 调用EmpController ,所以字符串返回给中央控制器。如…

    Java 2023年6月16日
    080
  • SpringCloud微服务实战——搭建企业级开发框架(三十四):SpringCloud + Docker + k8s实现微服务集群打包部署-打包配置

    SpringCloud微服务包含多个SpringBoot可运行的应用程序,在单应用程序下,版本发布时的打包部署还相对简单,当有多个应用程序的微服务发布部署时,原先的单应用程序部署方…

    Java 2023年6月9日
    067
  • HashMap(get和put)jdk8

    get逻辑: HashMap数据结构为数组加链表加红黑树、只有当链表数量大于8时、才将链表转换为红黑树、时间复杂度由链表的O(N)转换为红黑树的O(logN) // 主要看getN…

    Java 2023年6月16日
    093
  • java工作流软件发送邮件的方案

    利用javamail的功能将发送邮件的功能集成到java工作流系统中。javamail包提供有发送邮件的方法,设置发送人地址,收件人地址,抄送,主题,邮件服务器地址,认证用户等信息…

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