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