【问题标题】:Is Azure limiting outgoing connectionsAzure 是否限制传出连接
【发布时间】:2020-07-03 22:12:36
【问题描述】:

我在 Azure 中运行一个虚拟机,我在该虚拟机上有一个服务,可以进行大量传出 http 客户端调用。一段时间后(大约 10 分钟),当服务进行了大约 5000-10000 次调用时,它突然开始收到 Connection Refused 作为对请求的响应。

在本地运行相同的服务时(在许多环境和计算机中尝试过),它运行时不会出现任何错误。我们正在为请求使用 HttpClient 类。 这些请求在同时运行的 3 个任务中完成。

我应该注意 Azure 中的传出连接数量有一些限制吗?

【问题讨论】:

  • 您确定没有正确处理 HttpClient 不会导致任何线程饥饿吗?您使用的 VM 大小是多少?与至少有 4 个核心的本地 PC 相比,我怀疑 Small(有 1 个核心和 1.75GB 内存)?谢谢。
  • 似乎不是我们的代码。当我们运行服务并在 VM 上出现错误时,我在 VM 上打开了 chrome 并尝试从那里调用 REST 并得到相同的错误......所以这似乎是机器/基础设施问题,而不是代码本身。
  • 如果它是一个端口/线程饥饿,那么无论您如何访问 Http 堆栈,您仍然会有相同的行为。我们对并发 TCP 连接的限制是 500K。我能想象的唯一另一件事是你触发了一些 DDoS 警报,你会受到限制。要检查的事情是: 1)你当时有足够的BW吗? 2) 你有足够的线程可用 3) 尝试不同的角色大小,看看它的行为是否相同。然后它证实了我的 DDoS 理论。如果没有,那就是别的东西了。
  • 好的。谢谢会检查它。在我们本地网络上的虚拟机上尝试使用完全相同的配置访问远程主机(这不是我们的)并且它可以工作......但是 Azure 中的同一个虚拟机出现错误......所以这表明它不会是线程问题吧?
  • 本地机器的规格是否与您在 Azure 上使用的规格相同?如果是,那么这不是线程问题。如果不是,这可能仍然是一个正当的理由。可能不是原因,但仍有待研究。

标签: azure


【解决方案1】:

每个 Azure 订阅都有最大连接限制。

您应该重复使用连接而不是打开新的连接。

在此处了解更多信息:http://www.freekpaans.nl/2015/08/starving-outgoing-connections-on-windows-azure-web-sites/

【讨论】:

    【解决方案2】:

    过去我们遇到过类似问题,看起来虚拟机到外部 IP 的出站连接限制为 1024。内部 Azure IP,当它们位于同一个数据中心时,不会有此限制,因为内部路由表能够处理这些连接。

    这里有很多相关信息: https://docs.microsoft.com/en-us/azure/load-balancer/load-balancer-outbound-connections#snatexhaust

    总结要点:

    1. 如果没有公共 IP,请尝试为您的 VM 分配一个公共 IP。这仅在您运行少量虚拟机时才可行。
    2. 如果您在一个 IP 后面运行,请尝试将多个 IP 添加到您的 VNET/负载平衡器。每个外部 IP 都会增加您的连接限制。
    3. 尝试优化您的连接使用,即保持连接更长时间以实现高效的管道内衬。

    【讨论】:

      【解决方案3】:

      如果您使用的是 Linux VM,请执行以下命令来检查打开文件/套接字的限制

      Ulimit - d cmd will give the value. The default is 1024 
      

      您可以通过在您的 limits.conf 文件中附加以下内容来永久更改此值

      *soft nofile 65536
      *hard nofile 65536
      

      【讨论】:

        【解决方案4】:

        小心 Azure DNS 限制。

        每个虚拟机的 DNS 查询流量都会受到限制。节流不应影响大多数应用程序。如果观察到请求限制,请确保启用客户端缓存。有关详细信息,请参阅 DNS 客户端配置。

        来源:https://docs.microsoft.com/en-us/azure/virtual-network/virtual-networks-name-resolution-for-vms-and-role-instances

        【讨论】:

          【解决方案5】:

          我知道它晚了,但可能对其他人有帮助。
          是的,Azure 根据订阅有出站连接限制。
          解决方案:
          不要使用多个http client 实例,每个应用程序使用一个实例。
          连接限制的参考链接是Here

          示例:
          如何使用来自Here
          的单实例示例C#

          【讨论】:

            【解决方案6】:

            这里是Azure page for service limits。它没有指定每个时间范围的调用,但将 TCP 的最大网络连接设置为 500K,并且在该表下方有您可能达到的“Web 应用程序(网站)限制”设置。

            【讨论】:

              【解决方案7】:

              VM 或 Web 角色上的 TCP 连接限制为 500K(在幕后 Web 角色也位于 VM 上)。 Azure limits可以参考下面的链接

              看起来您的应用程序在发出出站请求方面很繁重。在这种情况下,您可能希望分离这部分并使用“Azure 函数”Azure Functions,它为您提供无服务器架构功能。

              【讨论】:

                【解决方案8】:

                在完全不了解 Azure 的情况下,我想知道问题是否在于您的 VM 对 TCP 套接字的数量有限制 - 所有处于 FIN-WAIT 状态的(关闭的)TCP 连接可能已经用尽了为 Azure 设置的一些限制,即在其他情况下不设置。这纯属猜测。

                【讨论】:

                  猜你喜欢
                  • 2015-03-30
                  • 2010-09-07
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-11-18
                  • 2014-01-31
                  • 1970-01-01
                  • 2014-11-18
                  • 1970-01-01
                  相关资源
                  最近更新 更多