2

我有一个基于 basicHttpBinding 的简单“Hello world”服务。该服务托管在四核 CPU 上。

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

为什么其他核心不用于处理?

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

在此处输入图像描述

4

2 回答 2

3

为您的服务配置一个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";
   }
}
于 2012-08-12T19:17:37.227 回答
1

BasicHttpBinding的API 文档这样说:

不保证任何实例成员都是线程安全的。

这意味着不应从多个线程并行调用单个 BasicHttpBinding 实例,因此不能分布在多个 CPU/CPU 内核上。

于 2012-08-12T18:14:24.843 回答