我有一个基于basicHttpBinding的简单的"Hello world“服务。该服务托管在四核CPU上。
当我运行负载测试时,只有一个内核被占用(95%),其他三个内核大约占4-8%。
为什么不使用其他内核进行处理?
设置ConcurrencyMode = ConcurrencyMode.Multiple没有帮助。

发布于 2012-08-13 03:17:37
为您的服务配置ServiceBehavior。
默认情况下,WCF使用ConcurrencyMode=ConcurrencyMode.Single。该模式在一个线程中运行对您的服务的所有请求。
使用ConcurrencyMode.Single时,只要方法正在运行,
就不会再次调用对象。操作返回后,可以再次调用该对象。
一个CPU核心用于运行该线程。
为您的服务添加以下属性,以使用所有CPU:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]启用该模式时,请注意服务状态。如果更改状态,您可能需要实现自己的锁定。
有关更多详细信息,请查看。
还要确保您的客户端同时进行四个调用(在客户端中实现多线程)。否则,即使您的服务器支持多线程,您仍将拥有连续的单线程调用处理。
检查代码后的更新:
您的WCF方法不会做任何可以加载CPU的工作。请将您的方法替换为一些使用大量CPU的函数(计算散列或阶乘),然后重新检查。
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
public class HelloService : IHelloService
{
public string HelloWorld()
{
return "Hello world";
}
}发布于 2012-08-13 02:14:25
API docs for BasicHttpBinding这样说:
不能保证任何实例成员都是线程安全的。
这意味着不应该从多个线程并行调用单个BasicHttpBinding实例,因此不能分布在多个CPU/CPU核心上。
https://stackoverflow.com/questions/11924507
复制相似问题