2012-08-12 54 views
2

我有一个基于basicHttpBinding的简单的“Hello world”服务。该服务托管在四核CPU上。简单的WCF“Hello world”服务只占用一个加载的CPU核心

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

为什么其他内核不能用于进程?

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

Enter image description here

+0

请发布客户端和服务器代码。 – 2012-08-13 10:49:29

+0

http://zalil.ru/33674140 – VoimiX 2012-08-13 11:12:35

+0

检查答案更新 – 2012-08-13 12:19:26

回答

3

为您的服务配置一个ServiceBehavior

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

With 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

API docs for BasicHttpBinding这样说:

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

这意味着不应该从多个线程并行调用一个BasicHttpBinding实例,因此不能跨多个CPU/CPU核心进行分布。

+2

实际上,您所引用的仅仅是标准免责声明,如果您想在多线程环境中使用BasicHttpBinding,则需要自己进行锁定。类*本身*不是线程安全的。同时打开多个BasicHttpBinding连接到相同的服务工作得很好,你绝对可以使用多个CPU。见德米特里的答案。 – ErnieL 2012-08-13 01:20:03

相关问题