gpt4 book ai didi

c# - 无法解释的超时和延迟从 HttpClient SendAsync 请求获取响应

转载 作者:行者123 更新时间:2023-12-04 07:50:15 28 4
gpt4 key购买 nike

我们有一个 .NET 4.7.2,它混合使用异步和同步代码(我理解这是一个禁忌)。我们在 Windows 服务上使用 NancyFX。该服务获取休息调用并进行休息调用。线程池看起来很健康(整个进程只使用了 70 个线程)。出于某种原因,某些 http 响应会延迟 10 秒,有时会延迟 100 秒并导致任务取消。
下面是代码的结构

public async Task<Guid> SomeFunction()
{
...
var response = await _httpClient.SendAsync(request, cancellationToken);
...
}
SomeFunction().Result
首先,我确信响应在某个地方的网络上由于某种原因被延迟了。但是我们已经排除了多种方法,最重要的是通过 perfview 查看 ETW 跟踪并看到数据包几乎立即返回(使用 Microsoft-Windows-NDIS-PacketCapture/PacketFragment)
其次,我确信这与异步方法上的 .Result 代码导致的线程池问题有关。但是,该进程上的线程再次稳定在 70 个线程。通过 perfview,我可以看到饥饿确实没有发生(使用 Microsoft-Windows-DotNETRuntime/ThreadPoolWorkerThreadAdjustment/Adjustment)
我还想过,也许我遇到了 await/async 和 .Result 的死锁情况,但是死锁意味着请求永远不会完成,而不是它会延迟 10 秒。
我还仔细检查过我们只使用了一个 httpclient 实例,确实如此。
还能是什么?
在这一点上,我们正在删除 .Result 并用适当的 async/await 替换它。但是我没有证据表明这会解决问题,因为我没有看到任何死锁或线程耗尽的证据。
这是一个perfview分析
enter image description here
我们也在考虑我们正在以某种方式耗尽 http 连接的建议。我认为情况并非如此的一个原因是,根据 perfview,请求正在发送并且数据包将其返回,但响应并未构成 c# 堆栈。然而,这些性能计数器可能表明正在进行一些排队。
enter image description here
更新
我们通过这个增加了http连接,它似乎生效了。
<connectionManagement>
<add address="*" maxconnection="1024"/>
</connectionManagement>
上面显示的排队完全消失了。然而,这些请求没有完成的问题仍然存在

最佳答案

What else could it be?


你已经检查了我的第一个猜测,那就是线程池饥饿。
还有另一种可能性,这取决于 API 调用的完成方式。如果对同一主机有许多并发请求,则 .NET 网络堆栈可能会限制您。非 ASP.NET 应用程序对同一主机的 2 个并发请求具有默认限制。在这种情况下,您有一个服务器应用程序,但没有一个 ASP.NET 应用程序,因此默认情况下您会有相当严格的节流。
建议:将此代码放在您的启动中:
ServicePointManager.DefaultConnectionLimit = int.MaxValue;
请注意,默认情况下 .NET Core 不会限制客户端 HTTP 请求,因此这只是模拟现代 .NET 平台上的默认行为。

关于c# - 无法解释的超时和延迟从 HttpClient SendAsync 请求获取响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67024294/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com