2

我们有一个 WCF 服务,我们在 azure 上托管。它需要一些 xml 并在内存中处理它(没有外部调用/db 等,大约需要 150 毫秒)并返回一些 xml。

我们一直在对其进行负载测试,当我们在 1,2 和 4 核机器上运行它时,我们可以最大限度地利用处理器并获得每秒最多 40 次调用的吞吐量(在 4 核机器上)。然而,当我们切换到一台 8 核机器或两台 4 核机器时,我们仍然每秒只能收到大约 40 个调用。

当我扩大处理机器的数量时,为什么我无法获得更多的吞吐量?我希望添加更多机器会相当线性地增加我的吞吐量,但事实并非如此。为什么不?

4

1 回答 1

2

不确定 Azure 是否有特定的限制,但 .NET 框架对一次可以处于活动状态的同一地址的传出连接数有限制。在这篇名为“提高 Web 服务性能”的 MSDN 文章中,它提到默认值为 2。

配置 maxconnection 属性

Machine.config 中的 maxconnection 属性限制并发出站呼叫的数量。

注意 此设置不适用于本地请求(来自与 Web 服务位于同一服务器上的 ASP.NET 应用程序的请求)。该设置适用于来自当前计算机的出站连接,例如,ASP.NET 应用程序和调用其他远程 Web 服务的 Web 服务。maxconnection 的默认设置是每个连接组两个。对于调用 Web 服务的桌面应用程序,两个连接可能就足够了。对于调用 Web 服务的 ASP.NET 应用程序,两个通常是不够的。将 maxconnection 属性从默认的 2 更改为(CPU 数量的 12 倍)作为起点。

<connectionManagement>
  <add address="*" maxconnection="12"/>
</connectionManagement> 

请注意,每个 CPU 12 个连接是一个任意数字,但经验证据表明,当您还将 ASP.NET 限制为 12 个并发请求时(参见本章后面的“线程”部分),它对于各种场景都是最佳的。但是,您应该根据您的情况验证适当的连接数。

这些限制是为了防止单个用户独占远程服务器上的所有资源(DOS 攻击)。由于这是在 Azure 中运行的一项服务,我猜想他们在终端上进行了节流,以防止用户使用来自单个 IP 的所有传入连接。

我的下一步是检查并查看 azure web 角色是否存在并发连接限制(此线程建议存在并且它是可配置的)并增加它。否则,我会尝试从多个来源执行负载测试,看看您是否仍然遇到相同的限制。

于 2012-10-23T20:12:52.810 回答