- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
最近一位朋友找到我,让我帮看他们的一个aspnet core service无端cpu高的问题。从描述上看,这个service之前没有出现过cpu高的情况,最近也没有改过实际的什么code。很奇怪了,会有什么变化导致cpu上去了呢?
由于比较容易复现 (据说一启动service,cpu就上去了),我便让那位朋友在cpu高的时候直接手动把.net进程dump了一下。于是就开始用windbg分析了 。
先看一下案发时进程中的线程情况,毕竟它们是让进程动起来的源泉哈。大部分线程都运行到如下类似位置(下面的callstack是虚拟化的,因为为了朋友的隐私,code已经虚拟化):
。
这里可以看出有约 38/2=19 个线程运行到 Services.CronJob+d__1.MoveNext 这个位置。我又问了那位朋友,当时的运行环境是大约20个cpu core。真巧哈,几乎所有cpu core都很有可能跑到了这个地方了.
注:上面如何知道有38/2个线程,而不是38个线程呢?这是因为一般来说,当某个函数正在被调用时,callstack中会显示出两次,如图哈:
看到没,在 "current frame" 下面显示的上一层调用关系中会也显示这个方法,此时它是 callee 哈.
那么这个 Services.CronJob+d__1.MoveNext 是何方神圣呢,名字叫cpu killer更贴切吧?😂 。
跑题了,去看看这个方法的代码。注意到这个是compiler generated code,所以就先看看generated code长啥样吧:
先利用上图中透露出来的method的md地址,用 !dumpmd 看一下这个方法的信息:
反编译看一下:
天啦撸,这好像是 async state machine code ,没事凑合看吧😓仔细观察那些标红的位置后,我发现这里面有些蹊跷啊。如果schedules不是null的话,有两种情况,这两种情况最终都会到label_10的地方,在那里,cpu可以得到休息;但如果schedules是null的话,会不会一直以同步的方式高速循环在while里?我在所有threads的stack上找寻,找不到有类型为List<string>的instance被stack引用着,所以很有可能是这个原因了.
另外,从 Services.CronJob+d__1.MoveNext 这个名字看,这个 closure 应该是在user code class CronJob 中生成的,我们去看看。用 !dumpheap
正好19个CronJob, 这和刚分析的有19个线程正高速运行吻合。因为心情不错,所以再去看看CronJob的样子吧:
。
看起来这个CronJob是个long running的IHostedService,在循环中有的flow没有让thread休息导致cpu上来了.
1 protected override async Task ExecuteAsync(CancellationToken stoppingToken) 2 { 3 await InitializeJobAsync(); 4 5 while (! stoppingToken.IsCancellationRequested) 6 { 7 List< string >? schedules = PreferenceService.GetSchedules(Region); 8 if (schedules == null ) 9 { 10 11 } 12 else 13 { 14 await ProcessJobAsync(schedules); 15 await Task.Delay(TimeSpan.FromSeconds( 10 ), stoppingToken); 16 } 17 } 18 }
1 protected override async Task ExecuteAsync(CancellationToken stoppingToken) 2 { 3 await InitializeJobAsync(); 4 5 while (! stoppingToken.IsCancellationRequested) 6 { 7 List< string >? schedules = PreferenceService.GetSchedules(Region); 8 9 await ProcessJobAsync(schedules); 10 await Task.Delay(TimeSpan.FromSeconds( 10 ), stoppingToken); 11 } 12 }
于是原因便是,当时加了这个empty if block后,由于 PreferenceService.GetSchedules 总不是null,所以没有进入问题flow;后来配置变了,返回了null,进入问题flow,问题flow又错过了await Task.Delay(),所以悲剧发生。.
据这位朋友说,他的同事后来说:"这个empty if block当时是个 placeholder 。现在不用了,可以删了" ……。。唉,删是好删,不过在发现root cause之前可是让这位朋友背了不少时间的锅哈 。
最后此篇关于一次.netcode中的placeholder导致的高cpu诊断的文章就讲到这里了,如果你想了解更多关于一次.netcode中的placeholder导致的高cpu诊断的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
当我在一台机器上启动我的应用程序时,它立即退出说它已经“停止工作”。在事件日志中,我看到 MissingMethodException 是原因。没有显示异常对话框,并且在事件日志详细信息中我看不到任何
我正在从 Windows Phone 8 模拟器调用 Azure 移动服务。有时我会收到没有 InnerException 属性的 MobileServiceInvalidOperationExcep
我正在创建一个 Web 客户端,用于使用 ACS Calling SDK 加入 Teams session 。我在加载诊断 API 时遇到问题。 Microsoft 提供了此页面: https://l
知道为什么我的应用程序被杀死吗?我是该节点的唯一用户。 我的历史记录服务器也没有显示任何内容。我如何进一步追踪并了解是谁杀死了它,以及为什么以及如何修复它? ubuntu@anmol-vm1-new:
我正在创建一个 Web 客户端,用于使用 ACS Calling SDK 加入 Teams session 。我在加载诊断 API 时遇到问题。 Microsoft 提供了此页面: https://l
我正在寻找一种从 Windows Azure 中的性能计数器获取原始数据的方法 使用诊断 API。 到目前为止,我注意到我可以从已知的计数器中配置一个计数器 并设置该计数器的采样率。 诊断配置中配置的
我在将 WebRole(WCF 服务)部署到 Azure 时遇到问题。我的 WebRole 持续显示忙碌状态至少 30 分钟,直到我中止它。我通过 Visual Studio 2010 进行部署。我正
Clang has several kinds of diagnostics ,其中三种主要是错误、警告和注释。 注释通常伴随着某些警告和错误,例如重复定义: error: conflicting t
调试由于 Win32 生产过程中的死锁而导致的明显挂起的步骤和技术是什么。我听说 WinDbg 可用于此目的,但您能否提供有关如何实现此目的的明确提示? 最佳答案 此 post应该让您开始使用各种选项
我有一个在 Azure 上运行的应用程序,它会记录(实际上是跟踪)到 Azure 诊断存储。我正在寻找一个可以用来分析这些日志的好工具。 我知道可以使用 Visual Studio 中的服务器资源管理
我在当前项目中使用 Bazel 经历了很长的“干净构建”时间。 我们推荐的诊断步骤是什么? 最佳答案 尝试使用 --profile 分析您的构建 语法为 bazel build --profile f
我在解释 gcc (4.8.2) 警告和错误时遇到问题。更准确地说,很难分辨一个问题在哪里结束,另一个问题从哪里开始。我只能通过控制台访问构建机器,因此不能选择使用 IDE。 我真的需要能够快速区分个
我想为我的 azure 云服务启用 azure 诊断,但我有点困惑。 我读了这篇文章:https://learn.microsoft.com/en-us/azure/cloud-services/cl
我想我这里有个卷曲的地方...我有一个WinForms应用程序,当它作为x64进程运行时,它每小时大约会定期崩溃。我怀疑这是由于堆栈损坏引起的,并且想知道是否有人看到过类似的问题,或者是否有诊断和检测
我正在研究 Azure Web 角色的性能改进,并想知道在发布/部署到生产站点时是否应保留诊断。 This article说要禁用它,但其中一条评论说您会丢失关键数据。 最佳答案 您绝对应该启用它。一
我的解决方案中有多个 Web 和辅助角色,但我还有一个在 Azure 托管 VM 上运行的非 Azure 应用程序。该应用程序连接到 Azure 存储以执行各种操作,例如读取和写入 blob 和队列,
我仍在努力理清思路 Azure Service Fabric Stateful Actors 。因此,我的(当前)问题最好放入这样的示例中: 我有一个帮助台系统,其中每张票证都是一个有状态的参与者。参
CUDA 到处都有大量文档和指南,但我找不到任何形式的说明来指导如何诊断编译但收到神秘、模糊错误消息(例如“未指定启动”)的内核“这些 block /网格结构有意义吗?”等等 我可以以某种方式拦截cu
我没有找到太多解决 azure 事件网格中事件丢失场景的方法。 因此我提出与以下场景相关的问题: 我们的代码将事件发布到域。 事件将传送到订阅中配置的网络 Hook 。 这在一段时间内有效。 消费者(
这个问题有点宽泛,但我觉得没有一个地方可以帮助系统地诊断 Elasticsearch 问题。广泛的类别可能是: 客户 查询错误 查询结果不正确 无法解释的行为 服务器 设置问题 性能问题 严重错误 无
我是一名优秀的程序员,十分优秀!