none
WCF跨服务器访问性能问题 RRS feed

  • 问题

  • 本机部署客户端和服务端时,服务端监控到了很高的线程数,并且客户端请求延迟正常,但服务端部署到别的服务器时(尝试过win10、winserver2008、winserver2012)请求延迟随时间线性增长,并且服务端线程数很低。

    服务使用了单调多线程模式,同步上下文设置为false,使用basic HTTP 绑定,并且应用了官方文档中的使用工作线程池提高线程数量的方案,设置了最小线程池数量100,最大300,并设置了 service behavior的 throttling都为int最大值。

    契约使用了简单契约,调用方法sleep 2秒并简单返回一个对象,没有锁和资源操作。

    客户端循环100次入线程池调用服务端访问,每次简单执行new client、open、call、dispose client操作。

    当服务端和客户端部署到本机时,客户端100次调用很快返回,最小2秒多时间,服务端线程数达到70多个。但当服务端部署到不是本机时,服务端线程数只有10几20个,并且查看服务端控制台输出,几乎每秒只处理了2个服务实例。经过很长时间后所有请求才结束。并且查看日志发现请求延迟随时间线性增长。

    除此之外,无论服务端部署在本地还是其它服务器都出现了每隔一些请求服务端暂停一下的情况,结果导致暂停的一瞬间只有一个并发,其它并发请求都被阻塞。

    问题:

    1、请问是什么原因导致的跨服务器请求时发生的以上性能降低的现象,是否有解决方案

    2、每隔一些请求的阻塞是否有解决方案

    谢谢!

    Denni

    2017年11月28日 3:33

答案

  • Hi Denni,

    对于这个问题是由HTTP protocol特性决定的。客户端默认保持HTTP连接,并且当访问同一个服务器的时候继续使用之前的链接。HTTP默认最大连接数是2.

    目前有两种解决方案,一是使用custom binding,并且设置keepAliveEnabled="false",这使每一次请求都打开一个新的连接。

    二是设置ServicePointManager.DefaultConnectionLimit 比如下面的代码就是设置客户端的最大连接数是10.

            static void Main(string[] args)
            {
                ServicePointManager.DefaultConnectionLimit = 10;
                CountdownEvent waitHandle = new CountdownEvent(threadCount);
                
               //你的其他代码
            }
    

    Best Regards,

    Tao Zhou


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 Denni_work 2017年11月29日 6:41
    2017年11月29日 5:40
    版主

全部回复

  • Hi Denni,

    依据你的描述,问题在你的环境下普遍存在,跟具体项目没有关系。我建议你把整个测试的项目共享给我们,这边我们可以尝试去重现你的问题。

    对于WCF 服务实例的问题,你是否已经设置了Instancing PerCall Concurrency Multiple?

    在部署本机和服务器时,都是部署在IIS 上面还是Self-host 比如在Windows Service里面。

    排除是IIS的一些设置,我建议你创建一个Console程序托管你的WCF Service,这个服务的反应时间还是一样长么?

    另外,在服务在本机时,你在不是本机的电脑上访问这个服务的话,速度是如何的?

    Best Regards,

    Tao Zhou


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年11月28日 5:37
    版主
  • 感谢 Tao Zhou 的回复,

    我设置了 PerCall 和 Multiple,并且为了监控方便都是用了Console托管,没有使用IIS或windows服务托管。

    我尝试了跨服务器的访问,包括访问别的服务器和别的服务器请求本机,结果都出现了跨服务器访问的性能问题。

    我把测试的demo 放在了 github上:https://github.com/yueshen005/TestWCF

    请您帮助查看,再次感谢回复。

    Thanks,

    Denni


    2017年11月28日 6:47
  • Hi Denni,

    对于这个问题是由HTTP protocol特性决定的。客户端默认保持HTTP连接,并且当访问同一个服务器的时候继续使用之前的链接。HTTP默认最大连接数是2.

    目前有两种解决方案,一是使用custom binding,并且设置keepAliveEnabled="false",这使每一次请求都打开一个新的连接。

    二是设置ServicePointManager.DefaultConnectionLimit 比如下面的代码就是设置客户端的最大连接数是10.

            static void Main(string[] args)
            {
                ServicePointManager.DefaultConnectionLimit = 10;
                CountdownEvent waitHandle = new CountdownEvent(threadCount);
                
               //你的其他代码
            }
    

    Best Regards,

    Tao Zhou


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 Denni_work 2017年11月29日 6:41
    2017年11月29日 5:40
    版主
  • 感谢 Tao Zhou 的回复,

    我使用custom binding配置客户端和服务端 keepAliveEnabled="false" 之后问题没有发生变化,但使用您提供的代码修改默认连接数限制后确实解决了问题!真是太感谢了!

    您的回复我会标记为标准答案。

    Thanks,

    Denni

    2017年11月29日 6:41