首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单的WCF "Hello world“服务在负载下只占用一个CPU核心

简单的WCF "Hello world“服务在负载下只占用一个CPU核心
EN

Stack Overflow用户
提问于 2012-08-13 02:06:44
回答 2查看 817关注 0票数 2

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

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

为什么不使用其他内核进行处理?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-13 03:17:37

为您的服务配置ServiceBehavior

默认情况下,WCF使用ConcurrencyMode=ConcurrencyMode.Single。该模式在一个线程中运行对您的服务的所有请求。

使用ConcurrencyMode.Single时,只要方法正在运行,

就不会再次调用对象。操作返回后,可以再次调用该对象。

一个CPU核心用于运行该线程。

为您的服务添加以下属性,以使用所有CPU:

代码语言:javascript
复制
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]

启用该模式时,请注意服务状态。如果更改状态,您可能需要实现自己的锁定。

有关更多详细信息,请查看。

还要确保您的客户端同时进行四个调用(在客户端中实现多线程)。否则,即使您的服务器支持多线程,您仍将拥有连续的单线程调用处理。

检查代码后的更新:

您的WCF方法不会做任何可以加载CPU的工作。请将您的方法替换为一些使用大量CPU的函数(计算散列或阶乘),然后重新检查。

代码语言:javascript
复制
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
public class HelloService : IHelloService
{
   public string HelloWorld()
   {
      return "Hello world";
   }
}
票数 3
EN

Stack Overflow用户

发布于 2012-08-13 02:14:25

API docs for BasicHttpBinding这样说:

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11924507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档