我有一个基于basicHttpBinding的简单的“Hello world”服务。该服务托管在四核CPU上。简单的WCF“Hello world”服务只占用一个加载的CPU核心
当我运行负载测试时,只有一个核心占用(95%),其他三个大约4-8%。
为什么其他内核不能用于进程?
设置ConcurrencyMode = ConcurrencyMode.Multiple
没有帮助。
我有一个基于basicHttpBinding的简单的“Hello world”服务。该服务托管在四核CPU上。简单的WCF“Hello world”服务只占用一个加载的CPU核心
当我运行负载测试时,只有一个核心占用(95%),其他三个大约4-8%。
为什么其他内核不能用于进程?
设置ConcurrencyMode = ConcurrencyMode.Multiple
没有帮助。
为您的服务配置一个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";
}
}
的API docs for BasicHttpBinding这样说:
所有实例成员不能保证是线程安全的。
这意味着不应该从多个线程并行调用一个BasicHttpBinding实例,因此不能跨多个CPU/CPU核心进行分布。
实际上,您所引用的仅仅是标准免责声明,如果您想在多线程环境中使用BasicHttpBinding,则需要自己进行锁定。类*本身*不是线程安全的。同时打开多个BasicHttpBinding连接到相同的服务工作得很好,你绝对可以使用多个CPU。见德米特里的答案。 – ErnieL 2012-08-13 01:20:03
请发布客户端和服务器代码。 – 2012-08-13 10:49:29
http://zalil.ru/33674140 – VoimiX 2012-08-13 11:12:35
检查答案更新 – 2012-08-13 12:19:26