我有一个WCF服务,它使用安全模式为TransportWithMessageCredential
的basicHttpBinding
。我正在调查一些客户遇到的超时问题。我已经写了一个小的测试应用程序,它在客户机上创建多个线程,并对服务器进行一个“简单”的调用,这在一段时间内除了Thread.Sleep
之外什么也不做。
当我运行这个测试应用程序时,它创建了10个线程,用远程方法实例化对象,然后调用它(告诉它休眠5秒(5000ms))。
我还尝试了多种不同的线程数和服务器上的“睡眠”时间,我发现前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
因此,根据上面的结果,您可以看到所有线程都已创建,并获得了“connection对象”。这大约需要500ms,考虑到它正在做的事情,这并不是太糟糕。
然后测试Multi3
和Multi4
大约需要5000毫秒(与预期完全一样),但是到第8、9和第10次调用返回时,它们大约需要8000-9000毫秒。
当我在服务器上监视它时,每个线程都是唯一的,并且具有不同的threadId,所以它不会与线程池发生冲突。
我将所有属性的服务限制设置为50。
<serviceThrottling maxConcurrentCalls="50" maxConcurrentInstances="50" maxConcurrentSessions="50"/>
所以看不出这可能是导致延迟的原因。
发布于 2014-05-21 05:00:40
您可能需要检查,然后可能需要使用ThreadPool.GetMinThreads
和ThreadPool.SetMinThreads
方法设置最小线程数。
下面的帖子,虽然有点陈旧,但对我们的团队有帮助,可能会为你提供有价值的见解。
供参考:
首先,WCF使用托管I/O线程来处理请求。CLR ThreadPool可防止一定数量的空闲I/O线程被销毁。当需要更多的I/O线程时,它们是由ThreadPool创建的,这是一种昂贵的开销。空闲线程的数量由“MinIOThreads”设置指定。您可以使用ThreadPool.GetMinThreads() API检查您的应用程序有哪些设置。默认情况下,在独立应用程序中,此设置是计算机上的CPU数量。例如,在我的双核笔记本电脑上,此设置为2。因此,您可能希望使用ThreadPool.SetMinThreads()提高此MinIOThreads设置。
https://stackoverflow.com/questions/23763931
复制相似问题