我在IIS上使用basicHttpBinding和aspNetCompatibilityEnabled = true部署了一个wcf服务
我有一个测试客户端,它同时调用多个服务功能。为了检查客户端和服务器上的服务调用的性能,我计算了在客户端(代理代码)和服务器上完成服务请求所需的平均时间。
经过8小时的测试(服务器和客户端在同一台机器上)后,我发现客户端的平均响应时间大约是34ms,因为服务器上的Avg执行时间大约为3ms,因此差异为31ms。 / p>我想知道为什么每次通话花费31毫秒是否合理?我该如何减少这个?
编辑:经过“Marc Gravell”的回复后发表
答案 0 :(得分:3)
经过长时间的研究和测试执行后,我得出的结论是,由于服务器上的线程调用时间而发生这种情况,因为WCF使用I / O完成端口(一种有效的线程模型。Detail here)
并且您需要在服务器的开头设置可能的最小并发要求,如下所示
ThreadPool.SetMinThreads(100, 100);
否则,由于池最小大小的默认值为2,2,您将受到影响,并且任何新线程都需要创建线程的成本(每个开发人员都知道这是最昂贵的过程)。通过以上操作,Threadpool将保持至少100个线程准备工作,您的服务将摇摆不定。
因为我将腰部缩短了31ms到6ms。
答案 1 :(得分:2)
您正在执行哪些操作?即有效载荷大小是多少?如果您使用非常小的有效负载执行大量操作,那么您显然会受到延迟等的影响;然而,带宽也可能是非平凡有效载荷的问题。如果您正在遭受这种情况,您可以尝试使用其他序列化程序。如果有效载荷大小是一个可能的问题,请告诉我,因为那里可能有一些选项。
也;你使用什么安全/流媒体/等选项?基于消息的安全性在两端都比较昂贵(与传输安全性相比),并且IIRC阻止流式传输,因为整个消息必须可用才能进行验证。类似地,如果你在周围投掷blob,你可以从启用MTOM(比basic-http更有效)和使用流API中受益。
答案 2 :(得分:0)
这里有很多问题要问。 Marc开始提出一系列好问题,但最终,我想我们无法从您那里获得有关您的程序,平台和网络的足够信息,以便在线为您提供完整的答案。
如果我处于你的情况,我要做的第一件事就是进行一些分析,以了解幕后发生了什么。具体来说,我使用ProcMon来分析导致并包括网络传输的系统活动,以确保我的网络时间精确。基于这些发现,我要深入了解线路上的内容,或者使用.NET性能分析器来查看堆栈上的哪些操作会花费您最长的时间。