我有 1 个应用程序网关,它有 2 个后端(Azure VM),它通过 IIS 托管 ASP CORE REST API。两者都使用端口 80 进行通信。
手动测试一切正常,直到我们使用 jmeter 进行 2500 线程 POST 请求负载测试时,某些请求得到“504 gateway timeout”作为响应。
我尝试对后端运行完全相同的负载测试,但没有收到任何不良响应。
我的应用程序网关是否配置错误?
默认情况下,当请求时间超过 20 秒时,Azure 应用程序网关会返回 504 错误。 在我看来,这个随机 504 错误的解释是系统过载过高。 可能的解决方案是增加该时间,或提高性能或后端,或并行执行少量请求。
我相信您需要联系Azure支持以了解当负载超过某个点时生成的错误日志。
我相信我在 Azure Web 网关中发现了一个错误。
我发现有两种方法可以得到 504 错误。
在 #2 上,您可以针对 Web 网关的监控日志运行以下命令:
Azure诊断 |其中 timeTaken_d > 55 且 httpStatus_d 在 (504) 中 |拿400
如果您看到很多东西在 60 秒左右抛出 504,则可能是这个问题。
当我在端口 443(我们为您使用 ssl.. 端口 80)上运行 Wireshark 跟踪以获取后端池入站 IP 地址时,我然后针对捕获运行以下显示过滤器:
tcp.analysis.retransmission 和 tcp.flags.syn == 1
您将看到同一 Windows 套接字/ TCP 流的大量重传。您采取至少重新传输 2-3 次的其中之一,并针对客户端端口运行此显示过滤器:
tcp.端口== < client side port >
您将看到一次对话以 fin 和 ack 等结束。或者可能是 rst 和 ack。不管怎样,谈话结束了。
此时,Web 服务器的套接字将进入时间等待状态,通常持续 60-240 秒,具体取决于操作系统等。通常是最大段长度的 2 倍。
但是 Web 网关正尝试在 < 30 seconds.. in my specific example I have seen as low as 22 seconds. It probably does not wait at all? The web server will ignore the syn packets b/c it is waiting to see if something comes over from the previous conversation. The is part of the standard and the gateway is ignoring it.
中重用该端口我可以查看网关是否存在端口耗尽问题,但我运行以下命令:
netstat -ano |查找str /i |找到“TCP”/c
我有大约 300 个连接。应该有 1000 个端口中的 10 个可用,并且它试图在 20 秒左右的时间内重用以前的端口?不遵循任何标准,甚至是他们自己的 Windows 标准。
最后发生的事情是它不断重试 syn,Web Gateway 在不可配置的 60 秒处放弃并发送 504 错误。
您可以在 iis Web 服务器的注册表中将等待延迟时间减少到 30 秒以上,然后重新启动。
这可能会消除 504 错误,但如果网关尝试在 30 秒之前进行连接,速度仍然会很慢。例如,FIN 连接在时间 0 秒结束。在 20 秒时,网关开始重用。您将在以下时间重试: 几毫秒 1秒 3秒 7秒
总共大约 11 秒,还有一些变化。在此期间,您的用户正在等待网络请求返回。如果呼叫通常需要 100 毫秒,那么它只需要 11 秒,再加上 100 毫秒。
如果网关尝试在 1-2 秒内使用该端口,则下一次重试将在 15 秒左右。这将为您提供 504,表示请求超时默认为 20 秒,或者如果您设置更高的值,则会延长您的超时时间。大约22秒后打电话。
希望我们能找到解决这个问题的方法。我现在有一个案件正在审理中。