我们有一个WCF服务,我们在azure上托管。它需要一些xml并在内存中处理它(没有外部调用/ db等,它需要大约150ms)并返回一些xml。
我们一直在对它进行负载测试,当我们在1,2和4核心机器上运行时,我们可以最大化处理器并获得每秒最多40个呼叫的吞吐量(在4核机器上)。但是,当我们切换到8核机器或两台4核心机器时,我们每秒仍然只能接收大约40个呼叫。
为什么在扩大处理机器的数量时,我可能无法获得更多吞吐量?我希望增加更多的机器会相当线性地增加我的吞吐量,但事实并非如此。为什么不呢?
答案 0 :(得分:2)
不确定Azure是否具有特定限制,但.NET框架对可以一次处于活动状态的同一地址的传出连接数有限制。在这篇名为Improving Web Services Performance的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中消耗所有传入连接。
我的下一步是检查并查看是否存在天蓝色网络角色的并发连接限制(this thread suggests there is and it's configurable)并增加它。否则我会尝试从多个来源执行我的负载测试,看看是否你仍然会遇到同样的限制。