我有一个基于 basicHttpBinding 的简单“Hello world”服务。该服务托管在四核 CPU 上。
当我运行负载测试时,只有一个核心被占用(95%),其他三个大约 4-8%。
为什么其他核心不用于处理?
设置ConcurrencyMode = ConcurrencyMode.Multiple
没有帮助。
我有一个基于 basicHttpBinding 的简单“Hello world”服务。该服务托管在四核 CPU 上。
当我运行负载测试时,只有一个核心被占用(95%),其他三个大约 4-8%。
为什么其他核心不用于处理?
设置ConcurrencyMode = ConcurrencyMode.Multiple
没有帮助。
为您的服务配置一个ServiceBehavior
。
WCFConcurrencyMode=ConcurrencyMode.Single
默认使用。该模式在一个线程中运行对您服务的所有请求。
使用 ConcurrencyMode.Single,只要方法正在运行,WCF 就不会再次调用对象。操作返回后,可以再次调用该对象。
一个 CPU 内核用于运行该线程。
为您的服务添加以下属性以使用所有 CPU:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
启用该模式时请注意服务状态。如果您更改状态,您可能需要实现自己的锁定。
检查ConcurrencyMode 枚举以获取更多详细信息。
还要确保您的客户端同时进行四个调用(在客户端中实现多线程)。没有它,即使您的服务器支持多线程,您仍然会有顺序的单线程调用处理。
检查代码后更新:
您的 WCF 方法不会执行任何可以加载 CPU 的工作。请用一些占用大量 CPU 的函数(计算哈希或阶乘)替换您的方法并重新检查。
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
public class HelloService : IHelloService
{
public string HelloWorld()
{
return "Hello world";
}
}
BasicHttpBinding的API 文档这样说:
不保证任何实例成员都是线程安全的。
这意味着不应从多个线程并行调用单个 BasicHttpBinding 实例,因此不能分布在多个 CPU/CPU 内核上。