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