使用net.tcp实现WCF

时间:2009-03-25 08:03:59

标签: wcf performance tcp

我有一个使用内置ServiceHost托管的WCF net.tcp服务,并且在进行一些压力测试时,我得到一个奇怪的行为。我第一次发送一堆请求时,会快速回答5到10个请求,其余请求以大约2秒的间隔返回。我第二次发送请求时,会快速返回10 - 20,并以2秒的间隔休息。

上述内容重复进行,直到我可以快速返回超过100个请求,但是如果我等待一分钟左右,则服务的内存使用量会下降,请求会快速返回到5-10。

我正在测试的服务有一个很小的延迟,所以我可以同时获得许多打开的连接,如果这个延迟被删除,请求返回得如此之快,以至于我可能同时打开2-5个连接。此延迟是模拟数据库连接和其他传出内容。

从行为看起来,ServiceHost正在分配一些东西,线程,类实例,但我无法弄清楚它是什么。

我可以在客户端调用服务来保持它的工作,但这似乎是一个糟糕的解决方案。

如果我对服务有很高的持续负载,它会迅速处理所有请求,但如果我有一段低活动时间,那么服务中的连接数量就会很慢。

我想我的问题是在WCF服务的高负载期间分配的内容是什么,我如何配置服务以预先分配更多已分配的内容。

编辑: 我做了一些测试,并查看taskmgr进程,我可以看到当servicehost'休息'时,有10个线程打开,但是当我开始发送请求时,threadcount会上升。只要threadcount很高,servicehost就可以快速处理传入的请求,但是如果我暂停发送请求,则open threadcount会减少,后续请求开始需要更长的时间来处理。

现在,我如何告诉servicehost保持一堆线程打开?或者超过默认保留的10-12?

4 个答案:

答案 0 :(得分:6)

好吧,经过大量的谷歌搜索,似乎问题是线程池。 CLR线程池分配了一些线程,当它们被使用时,它会限制新线程的创建,并且在一段时间之后它还会释放未使用的线程。

对于一个错误存在一些混淆,这意味着ThreadPool不支持SetMinThreads调用。

http://www.michaelckennedy.net/blog/PermaLink,guid,708ee9c0-a1fd-46e5-8fa0-b1894ad6ce0f.aspx

我不确定这个bug是否已经解决,或者是什么,因为当我修改ThreadPool设置时,问题仍然存在。

答案 1 :(得分:1)

决定请求如何同时处理的事情是ServiceThrottlingBehavior。有许多不同的threasholds会限制正在处理的请求数量。这还取决于您正在使用的绑定,例如wsHttpBinding默认为会话,而basicHttpBinding不使用会话,默认会话限制为10没有问题。

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms735114.aspx

答案 2 :(得分:1)

您引用的错误已在.NET 3.5 SP1中修复。这可能与问题有关,我认为更有可能(更有可能)限制是你的问题而不是莫里斯键入的线程。

<system.serviceModel>
  <service name="???" >
   <endpoint ... />
  </service>
</system.serviceModel>

这个“空”配置的节流限制是多少? 10节,16个并发通话!当心。

以下是有关线程的更多信息: http://www.michaelckennedy.net/blog/2008/08/20/ThreadPoolBugInNET20SP1IsFixed.aspx

答案 3 :(得分:0)

这感觉就像一个黑客,但它似乎解决了你的问题。问题是线程池需要时间来启动一个新线程,所以你真正需要的是等待待机的线程。将一个构造函数添加到您的服务中,并设置您想要的最小线程数。

  public YourService()
    {
        int workerThreads;
        int portThreads;
        ThreadPool.GetMinThreads(out workerThreads, out portThreads);
        ThreadPool.SetMinThreads(200, portThreads);
    }