none
WCF 高并发时客户端发送和服务端接收存在等待或延迟 RRS feed

  • 问题

  • 前提:

    .net版本: .net framework 4.5.2(服务端),.net framework 3.5(客户端)

    服务器:8核E5420 2.5GHZ,16G内存,1万转HDD磁盘

    windows版本:windows server 2008(服务端), windows server 2012(客户端)

    host: windows service(服务端), IIS(客户端)

    配置: 

    throttling: maxConcurrentCalls="10000" maxConcurrentSessions="10000" maxConcurrentInstances="20000",

    binding: basichttpbinding

    behavior:InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = false

    operation: 默认operation

    已经经过的调优:TCPIP连接数、userport限制,客户端http最大连接数限制,客户端channelfactory缓存等能搜到的各种调优方式

    延迟表现:

    使用loadrunner对客户端进行2000 vusers、3个客户端并发的压力测试,同时在客户端和服务端的业务执行方法前后添加日志、对客户端和服务端网络进行抓包分析。经过分析发现高并发时客户端偶尔出现代码调用请求后,请求没有立即发出,而是延迟了200ms左右才发出请求的现象,而服务端经常出现接收请求没有立即调用,接收消息到执行调用间也存在300ms左右延迟的现象。

    如图:表现:https://imgchr.com/i/CbQSeI  分析过程:https://imgchr.com/i/CblDU0(免费图床,新人不让发图请见谅)

    问题:

    请问是否存在什么优化方式可以降低或去掉如上面所说的延迟时间,提高并发数、降低响应时间;

    是否WCF框架在同步调用时已经达到了框架的性能上限(带业务代码每秒1800左右点击数)?


    • 已编辑 Denni_work 2018年6月8日 9:59 添加分析过程解释图
    2018年6月8日 9:36

全部回复

  • Hi,

    >>经过分析发现高并发时客户端偶尔出现代码调用请求后,请求没有立即发出,而是延迟了200ms左右才发出请求的现象,而服务端经常出现接收请求没有立即调用,接收消息到执行调用间也存在300ms左右延迟的现象。

    没有发出请求跟客户端有关,根据描述,已经设置了客户端最大http连接数,建议将客户端移到Server端,看看是否还有延迟。

    对于Server端接受请求,但没有执行,建议统计看下,当时已经有多少个请求在处理过程中了。

    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.

    2018年6月11日 8:10
    版主
  • Hi,

    首先感谢回复。

    关于您第一个建议,客户端无论在测试环境还是生产环境下都不会放在服务端,目前测试是3个客户端压力测试,只一个客户端放在服务端上可能没法重现问题,并影响服务端性能。我们可以确认网络是没问题的,测试网络环境是内网并且是在一个交换机下测试,带宽没有达到最大值。

    关于您第二个建议,请问有什么性能计数器指标可以检测吗,我查看了WCF性能计数器,percent of max concurrent instances, percent of max concurrent calls都没有达到预设的最大值(甚至没有达到WCF默认配置的值),calls per second 和 calls outstanding 这两个指标虽然能监控到实时的请求数和活跃处理请求,但处理请求的响应延迟也会影响LR的点击数,我不确定这个计数器是否有帮助


    2018年6月12日 2:25
  • >>客户端无论在测试环境还是生产环境下都不会放在服务端,目前测试是3个客户端压力测试,只一个客户端放在服务端上可能没法重现问题

    对于这个,是为了检测是不是因为客户端与服务端的网络连接数的限制造成的问题。

    >>throttling: maxConcurrentCalls="10000" maxConcurrentSessions="10000" maxConcurrentInstances="20000",

    对于你现在的设置,测试是不会超过这个值的,并不是你设置了,maxConcurrentCalls 等于10000,实际就能达到这么高效率。

    #WCF Performance Counters

    https://blogs.msdn.microsoft.com/sajay/2009/09/14/wcf-performance-counters/

    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.

    2018年6月13日 5:07
    版主
  • 对于这个,是为了检测是不是因为客户端与服务端的网络连接数的限制造成的问题。

    我尝试调整了客户端和服务端的HTTP、Tcpip注册表,修改到最大值。但LR 2000并发用户压力,3个web请求WCF服务端的每秒点击数只有1800左右,看起来没有达到设置的最大值,请问是否还有其它调整这个连接数限制的方法?

    我也怀疑是不是LR达到了性能上限,这台机器是windows7而不是windows server,也修改过了Tcpip的注册表,我不确定windows非服务器版的是不是有额外限制。请问这个连接数限制有什么计数器可以检测吗?

    2018年6月13日 6:13
  • 据我所知,好像是没有检测客户端与服务器端的连接数的。

    对于性能相关的问题,主要还是跟环境有关,论坛支持毕竟有限,我建议你联系微软的Support,这样他们可以直接在你们的环境下解决问题。


    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.


    2018年6月15日 4:34
    版主
  • 好的,调了很长时间没有明显改进,可能是要联系support了。感谢之前的回复。
    2018年6月15日 6:14