dotnet core webservice中的CPU使用率逐渐增加

Posted

技术标签:

【中文标题】dotnet core webservice中的CPU使用率逐渐增加【英文标题】:CPU Usage gradually increases in dotnet core webservice 【发布时间】:2019-08-08 09:57:11 【问题描述】:

我有一个 .net Core Web 服务,它似乎在缓慢增加其 CPU 使用率。 这意味着第一天它不会超过 10%,第二天它可以上升到 20%,依此类推。

在 linux 中使用TOP 命令,我的所有网络服务似乎有时都会显示在那里(可能是在发出请求时)然后消失。 这个特定的进程在运行了一段时间后,即使没有发出请求,也会持续消耗 cpu。

API 仍然工作正常,似乎有一些线程一直挂起并消耗 cpu。上次我检查我有 5 个线程消耗 3-4% cpu 并且由于某种原因没有死。 我的猜测是,在某些特定情况下,线程只是在消耗 cpu 时保持活动状态。

该应用程序在 ubuntu 机器上运行,我的第一步是尝试使用 ProcDump 创建一个转储文件,以便我可以分析这些线程并可能找到它们挂起的位置。 ProcDump 生成一个巨大的 21gb 文件,尝试使用 lldb 分析会引发内存不足异常。甚至尝试将其转移到 windows 机器上使用 windbg 进行调试,因为它无法打开文件,所以没有帮助。

由于没有特定的例外或任何事情,我无法真正分享任何代码,因为我不知道问题出在哪里......只是希望有一些建议可以帮助我找到解决方案或最不了解问题出在哪里。

非常感谢您的阅读,干杯

【问题讨论】:

【参考方案1】:

您可以尝试使用 jetBrains 的 DotMemory 之类的东西,它们也有相当高水平但很有帮助的指南 https://www.jetbrains.com/help/dotmemory/How_to_Find_a_Memory_Leak.html 它也值得检查您的启动文件并仔细检查您注册的服务是否以正确的方式使用,即不是当它们应该是瞬态甚至是单例等时添加为作用域

【讨论】:

感谢您的建议,最终问题出在httpClient的使用不当。不知道它会导致这样的问题大声笑... 我自己也有同样的问题,我在分析我们的应用程序时发现了多个 httpClient 实例。它使我们的网站每 3-4 天关闭一次。很高兴你找到它【参考方案2】:

所以我已经有一段时间了。 最终发现我的问题出在HttpClient 可能是静态类和创建 HttpClient 的新实例的一些错误组合导致了上面解释的问题。

通过使用HttpClientFactory 解决了这个问题 -

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-2.1

经验教训:)

【讨论】:

【参考方案3】:

有点晚了,但 Procdump for Linux 刚刚添加了 .NET Core 3 支持,可以生成更易于管理的核心转储。它会自动检测目标进程是否为 .NET Core 并执行正确的操作(即,无需指定开关)。

【讨论】:

以上是关于dotnet core webservice中的CPU使用率逐渐增加的主要内容,如果未能解决你的问题,请参考以下文章

相当于 dotnet core/csproj 中的 AssemblyInfo

2019-10-30-C#-dotnet-core-局域网组播方法

半译两个gRPC的C#库:grpc-dotnet vs Grpc.Core

ASP.NET Core 中的 dotnet-trace 不显示控制器的任何方法

在 dotnet core SDK 版本之间切换

Linux 上的 C# DotNet Entity Framework Core Migrations 错误