我有一个.net Core Web服务,它似乎在慢慢增加其CPU使用率。 这意味着第一天它不会超过10%,第二天它可能会超过20%,依此类推。
在Linux中使用TOP
命令,我的所有Web服务似乎有时都在那里显示(可能是在发出请求时),然后消失了。
运行了一段时间后,即使没有发出请求,该特定过程也会一直消耗CPU。
API仍然可以正常工作,似乎有一些线程一直在挂起并消耗CPU。上次检查时,我有5个线程消耗了3-4%的CPU,并且由于某种原因没有死亡。 我的猜测是,在某些特定情况下,线程只会消耗CPU才能保持活动状态。
该应用程序在ubuntu机器上运行,我的第一步是尝试使用ProcDump创建转储文件,以便我可以分析那些线程并可能找到它们挂在哪里。 ProcDump会生成一个巨大的21gb文件,尝试使用lldb分析该文件会抛出内存不足异常。甚至尝试将其传输到Windows机器上以使用windbg进行调试,但由于无法打开文件而没有帮助。
由于没有特定的例外或任何内容,我无法真正共享任何代码,因为我不知道问题出在哪里……只是希望能提供一些建议,这些建议可能有助于我寻求解决方案或解决问题最不明白问题出在哪里。
非常感谢您的阅读,欢呼
答案 0 :(得分:1)
您可以尝试使用诸如jetBrains的DotMemory之类的东西,它们也有相当高的水平,但很有帮助的指南https://www.jetbrains.com/help/dotmemory/How_to_Find_a_Memory_Leak.html,它也值得检查您的启动文件并仔细检查您注册的服务是否以正确的方式使用即当它们应该是瞬态甚至是单例时,不作为作用域添加
答案 1 :(得分:1)
有些晚了,但是Procdump for Linux刚刚添加了.NET Core 3支持,该支持可生成更多可管理大小的核心转储。它会自动检测目标进程是否为.NET Core并执行正确的操作(即,无需指定开关)。
答案 2 :(得分:0)
所以我已经有一段时间了。
最终发现我的问题出在HttpClient
上
可能是静态类和创建HttpClient
的新实例的某种不良组合,这导致了上述问题。
通过使用HttpClientFactory
解决了该问题,如此处所述-
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-2.1
经验教训:)