Wcf ThreadPool和async

时间:2009-08-12 17:05:29

标签: asp.net multithreading wcf asynchronous

我有一个asp.net网页,它正在向另一台服务器上的WCF服务发出7个异步请求。两个盒子都是干净的,没有安装任何其他东西。

我还将web.config中的maxconnections增加到了20。

我通过系统运行一个调用,页面返回800毫秒。它的长短是因为我认为线程池正在被压倒,因为一旦置于欠载状态,我无法获得每秒8个请求,即使两个四核盒运行在20%的CPU负载和sql服务器它已连接以每次通话不到10毫秒的速度返回查询。

我已将服务行为更改为concurrency.multiple但这似乎没有帮助。

任何人的想法。

3 个答案:

答案 0 :(得分:3)

这里有许多不同的因素可以发挥作用。在改变你的服务实例模型没有效果(这里是大IF)的说法中,可能是“瓶颈”在服务的上游。在Web服务器或客户端负载生成器上。

您需要审核几个方面进行调整:客户端,Web服务器,wcf服务服务器 - 假设中间没有网络设备。选择一个结束并朝另一端工作。由于我已经假设它不是服务,所以我从客户端开始,朝着wcf服务工作。

<强>客户端
什么机器驱动Web服务器的负载?一台笔记本电脑?桌面?专用测试代理还是共享代理?作为此测试目的的充当负载生成器的客户端也易受maxConnections 限制,因为这是客户端设置。

客户端生成负载的CPU利用率是多少?可能是测试驱动程序无法产生足够的负载来推动这些盒子吗?您可以在测试中添加其他测试客户端吗?

Web服务器
ASP.NET Web服务器上的machine.config中system.net/processModel元素是什么样的?尝试设置autoConfig = true。这将允许配置根据其运行的机器的“大小”自动调整大小。

WCF服务
查看WCF服务以查找可能正在运行并适当调整的任何限制默认值。请参阅MSDN上的ServiceThrottlingBehavior

如果您做出任何更改,请告诉我们您可能观察到的行为的任何变化(如果有的话)!

答案 1 :(得分:1)

这里真正的答案是每个人都错过了你正在使用的是一个ASP.NET网页。这意味着您的客户端是某种形式的Web浏览器。现代Web浏览器在任何时候都有2个并发异步请求的限制。这意味着您的5个请求排队等待前两个完成。一旦前两个,它将服务于接下来的两个,然后是接下来的两个,然后是最后一个。

所有这些往返和握手只需要时间。我猜你的往返时间大约是200毫秒,不幸的是你必须做4次。

我也非常不喜欢制作网络服务电话的“最大2”浏览器限制。

答案 2 :(得分:0)

此服务是在IIS,WAS还是Windows服务中托管的?

您应该尝试将Windows设置为以更高的优先级运行服务。您的WCF服务可能正在创建它需要的线程,但它们应该以低优先级运行。

希望有所帮助。