WCF因多个请求而减速

时间:2014-05-20 15:21:26

标签: c# multithreading wcf

我使用basicHttpBinding的安全模式为TransportWithMessageCredential的WCF服务。我正在调查我们的一些客户正在获得的超时问题。我已经编写了一个小测试应用程序,它可以在客户端上创建多个线程,并简化了一个简单的操作。呼叫服务器,该服务器除了Thread.Sleep以外什么都不做。

当我运行这个测试应用程序时,它会创建10个线程,使用远程方法实例化对象,然后调用它(告诉它睡5秒(5000毫秒))。

我还尝试了多种线程变化和“睡眠”。在服务器上的时间,我发现在正确的时间内返回前3或4,但后续的都需要更长的时间。

1:12:13.197 Starting Test - Multi1 1:12:13.199 Starting Test - Multi2 1:12:13.203 Starting Test - Multi3 1:12:13.228 Starting Test - Multi4 1:12:13.367 Got connection object - Multi3 1:12:13.368 Starting Test - Multi5 1:12:13.368 Got connection object - Multi1 1:12:13.369 Got connection object - Multi4 1:12:13.369 Got connection object - Multi2 1:12:13.391 Starting Test - Multi6 1:12:13.394 Starting Test - Multi7 1:12:13.398 Starting Test - Multi8 1:12:13.531 Got connection object - Multi5 1:12:13.532 Starting Test - Multi9 1:12:13.533 Got connection object - Multi7 1:12:13.535 Got connection object - Multi6 1:12:13.539 Starting Test - Multi10 1:12:13.565 Got connection object - Multi8 1:12:13.687 Got connection object - Multi9 1:12:13.691 Got connection object - Multi10 1:12:18.396 Ended Test - Multi3 1:12:18.396 Ended Test - Multi4 1:12:18.844 Ended Test - Multi2 1:12:19.345 Ended Test - Multi1 1:12:19.844 Ended Test - Multi5 1:12:20.344 Ended Test - Multi7 1:12:20.844 Ended Test - Multi6 1:12:21.349 Ended Test - Multi8 1:12:21.844 Ended Test - Multi9 1:12:22.344 Ended Test - Multi10

因此,根据上述结果,您可以看到所有线程都已创建,并且'连接对象'得到了。这需要大约500毫秒,考虑到它在做什么,这不是太糟糕。

然后测试Multi3Multi4在大约5000毫秒内完成(完全符合预期),但是当第8,9和10次呼叫回来时,它们大约需要8000-9000毫秒。

当我在服务器上监视它时,每个线程都是唯一的,并且具有不同的threadId,因此它不会与线程池作斗争。

我将所有属性的服务限制设置为50.

<serviceThrottling maxConcurrentCalls="50" maxConcurrentInstances="50" maxConcurrentSessions="50"/>

因此无法看到这可能导致延迟。

1 个答案:

答案 0 :(得分:1)

您可能需要使用ThreadPool.GetMinThreadsThreadPool.SetMinThreads方法检查然后设置最小线程数。

以下文章虽然有点陈旧,但对我们的团队有所帮助,可能会为您提供宝贵的见解 http://blogs.msdn.com/b/wenlong/archive/2010/02/11/why-are-wcf-responses-slow-and-setminthreads-does-not-work.aspx

供参考:
首先,WCF使用托管I / O线程来处理请求。 CLR ThreadPool保持一定数量的空闲I / O线程不被破坏。当需要更多I / O线程时,它们由ThreadPool创建,这是一种昂贵的。空闲线程数由“MinIOThreads”设置指定。您可以使用ThreadPool.GetMinThreads()API来检查您的应用程序的设置。默认情况下,在独立应用程序中,此设置是计算机上的CPU数。例如,在我的2核心笔记本电脑上,此设置为2.因此,您需要使用ThreadPool.SetMinThreads()

来提升此MinIOThreads设置。