【问题标题】:WCF hosting and PerformanceWCF 托管和性能
【发布时间】:2011-07-10 09:41:00
【问题描述】:

我有 WCF 服务。我已经用 basichttp 绑定和 tcp 绑定做了一些测试。

在控制台客户端中,我创建了数百个线程并使用 tcp 和 http 绑定访问服务。原来 TCP 比 http 快两倍。

然后我创建了一个在 IIS 上运行并访问服务的 Web 客户端。 原来http比TCP快。

这是怎么发生的? TCP不应该比basichttp快吗?代码如下所示。类似。

stopwatch start here

Thread[] ts = new Thread[100];  
for(int i= 0; i< ts.lenght;i++){  
  ts[i] = new Thread(foo);  // replace with bar for the second test.
  ts[i].start();  
}

for(int i 0;i< ts.lenght;i++){  
  ts[i].join();  
}  

stopwatch stop here.

public static void foo(){  
MyServiceClient myclient = new MyServiceClient("netTcpBinding");  
myclient.GetResult(1);  
} 

public static void bar(){
MyServiceClient myclient = new MyServiceClient("basicHttpBinding");
myclient.GetResult(1);
}

【问题讨论】:

  • 这取决于你的测试代码。
  • 您的第二个测试是否与服务在同一台机器上运行?
  • 它们是相同的代码。我只是使用两种配置调用一种服务方法。唯一的区别是绑定。
  • 是的,两者都在同一台机器上运行。唯一的区别是有约束力。例如:客户端 c = new Client("bindingTCPorHTTP"); c.invokeMethod();
  • 你在 IIS 端有缓存吗?

标签: c# .net wcf performance iis


【解决方案1】:

您是否知道 WCF 已默认开启限制。在运行这些测试之前,您应该在 web.config 的 serviceModel 部分中使用以下配置将其关闭:

<behaviors>
  <serviceBehaviors>
    <behavior> <!-- can omit name in .NET 4 -->
      <serviceThrottling 
        maxConcurrentCalls="10000" 
        maxConcurrentSessions="100000" 
        maxConcurrentInstances="100000" />
    </behavior>
  </serviceBehaviors>
</behaviors>

默认值因版本而异,但在 .NET 4 中大约为 16、10、100 或类似的值。即使您的 web.config 中没有限制条目,也会应用这些较低的默认值 /app.config.

祝你好运。

【讨论】:

【解决方案2】:

我认为问题在于托管过程。 .NET 默认在 线程池 中有一定数量的 工作线程,可以在创建线程任务之前被进程覆盖。考虑到您的第二个测试是在 IIS 中,在 WCF4 与 AppFabric 结合之前默认为 HTTP,由于野兽的性质,IIS 很可能会更改默认编号工作线程数。

仅仅因为您要求在任何给定机器上设置 100 个线程,并不意味着所有线程都将立即创建,而是排队,更不用说线程上下文切换的限制了。

作为一般规则,您创建的工作线程不应超过机器上的内核数。

【讨论】:

  • 这是真的。您可以执行 ThreadPool.SetMinThreads() 等操作。但请注意,WCF 会在此限制之上施加节流限制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多