简单的WCF“Hello world”服务在负载下仅占用一个CPU核心

时间:2012-08-12 18:06:44

标签: wcf performance

我有一个基于basicHttpBinding的简单“Hello world”服务。该服务托管在四核CPU上。

当我运行负载测试时,只占用一个核心(95%),其他三个占用大约4-8%。

为什么其他核心不用于处理?

设置ConcurrencyMode = ConcurrencyMode.Multiple没有帮助。

Enter image description here

2 个答案:

答案 0 :(得分:3)

为您的服务配置ServiceBehavior

默认情况下,WCF使用ConcurrencyMode=ConcurrencyMode.Single。该模式在一个线程中运行对您服务的所有请求。

  

使用ConcurrencyMode.Single,WCF不会再次调用该对象   只要该方法正在运行。操作返回后   可以再次调用对象。

一个CPU核心用于运行该线程。

为您的服务添加以下属性以使用所有CPU:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]

启用该模式时请注意服务状态。如果更改状态,则可能需要实现自己的锁定。

检查 ConcurrencyMode Enumeration 了解更多详情。

还要确保您的客户端同时进行四次调用(在客户端中实现多线程)。如果没有它,即使您的服务器支持多线程,您仍然会进行顺序单线程调用处理。

检查代码后更新:

您的WCF方法不会执行任何可以加载CPU的工作。请用一些繁重的CPU使用功能(计算哈希值或因子值)替换你的方法并重新检查。

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
public class HelloService : IHelloService
{
   public string HelloWorld()
   {
      return "Hello world";
   }
}

答案 1 :(得分:1)

API docs for BasicHttpBinding这样说:

  

不保证所有实例成员都是线程安全的。

这意味着不应该从多个线程并行调用单个BasicHttpBinding实例,因此不能分布在多个CPU / CPU内核上。