【发布时间】:2023-01-07 09:08:17
【问题描述】:
我们的 dotnet-core (3.1) 应用程序遇到高负载问题。
超过一定数量的连接(虚拟用户),我们遇到了瓶颈,服务器饥饿,我们得到请求超时,但进程没有崩溃(没有红隼日志)。我们正在使用 K6 来对我们的应用程序进行基准测试。目前,负载测试仅在登录页面上执行 GET 请求,这会在一个小数据集(无连接等)上触发一个基本的 SQL 请求。
我们使用 Visual Studio 2019 Perfomance Profiler 工具和 perfview 来调查这个问题,但是这些工具都没有帮助我们识别导致这个瓶颈的代码部分。
我找到了这篇关于线程池饥饿的文章:https://learn.microsoft.com/fr-fr/archive/blogs/vancem/diagnosing-net-core-threadpool-starvation-with-perfview-why-my-service-is-not-saturating-all-cores-or-seems-to-stall 当我们使用任意值调整最小 ThreadPool 时,如后例所示,我们在性能上有了巨大的改进(不在图表上)。这似乎是一个权宜之计,使用它有多糟糕?
System.Threading.ThreadPool.SetMinThreads(200, 200);
解释:2C_2G/100.csv => 2 核,2Go RAM,100 个虚拟用户
环境:
- nginx 作为反向代理
- K6 作为基准工具
- dotnet-core 3.1(带有 EntityFramework)
- 操作系统:Ubuntu 20.04
- mariadb 作为数据库
【问题讨论】:
-
是的,这是权宜之计。你可能想调查为什么你得到线程池饥饿。可能是由于处理传入 HTTP 请求的线程池线程上的阻塞 IO 请求引起的。您应该查看
async和任务。没有代码,我们无法提供进一步的帮助。 -
我们已经在使用异步和任务。
-
清楚地某物正在阻塞。我建议你仔细检查你的代码。
标签: c# nginx .net-core mariadb kestrel