首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >WCF因多个请求而变慢

WCF因多个请求而变慢
EN

Stack Overflow用户
提问于 2014-05-20 23:21:26
回答 1查看 1K关注 0票数 1

我有一个WCF服务,它使用安全模式为TransportWithMessageCredentialbasicHttpBinding。我正在调查一些客户遇到的超时问题。我已经写了一个小的测试应用程序,它在客户机上创建多个线程,并对服务器进行一个“简单”的调用,这在一段时间内除了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,考虑到它正在做的事情,这并不是太糟糕。

然后测试Multi3Multi4大约需要5000毫秒(与预期完全一样),但是到第8、9和第10次调用返回时,它们大约需要8000-9000毫秒。

当我在服务器上监视它时,每个线程都是唯一的,并且具有不同的threadId,所以它不会与线程池发生冲突。

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

代码语言:javascript
代码运行次数:0
运行
复制
<serviceThrottling maxConcurrentCalls="50" maxConcurrentInstances="50" maxConcurrentSessions="50"/>

所以看不出这可能是导致延迟的原因。

EN

回答 1

Stack Overflow用户

发布于 2014-05-21 05:00:40

您可能需要检查,然后可能需要使用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。因此,您可能希望使用ThreadPool.SetMinThreads()提高此MinIOThreads设置。

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

https://stackoverflow.com/questions/23763931

复制
相关文章

相似问题

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