【问题标题】:WCF - Network CostWCF - 网络成本
【发布时间】:2011-02-07 21:26:40
【问题描述】:

我在 IIS 上部署了一个 wcf 服务,使用 basicHttpBinding 和 aspNetCompatibilityEnabled=true

我还有一个测试客户端,它同时调用多个服务功能。为了检查客户端和服务器上服务调用的性能,我计算了在客户端(在代理代码中)和服务器上完成服务请求所需的平均时间。

经过 8 小时的测试(服务器和客户端在同一台机器上),我知道客户端的平均响应时间约为 34 毫秒,而服务器上的平均执行时间约为 3 毫秒,因此差异为 31 毫秒。

我想知道为什么每次通话都需要 31 毫秒,这是合理的吗?我怎样才能减少这种情况?

编辑:在“Marc Gravell”的回答后

  1. 在 IIS 中启用 SSL,在 WCF 级别没有其他安全性
  2. 服务执行次要的数据库操作,您可以通过给定的 3 毫秒平均执行时间来估算操作成本。 (如果这就是你所说的有效载荷)
  3. 没有 Blob,没有 MTOM
  4. 发送和接收消息不大,可能在 100 字节到 500 字节左右,简单消息合约
  5. 如果需要其他任何诊断信息,请告诉我
  6. 其实我更关心建立 TCP 连接的成本,如果你能解释 WCF 如何完成 TCP 连接工作,以及它对不同的可用绑定是否有任何差异

【问题讨论】:

    标签: .net wcf


    【解决方案1】:

    经过长时间的研究和测试执行,我得出的结论是,由于服务器上的线程调用时间,WCF 使用 I/O 完成端口(一种高效的线程模型。Detail here

    您需要在服务器启动时设置最低并发要求,如下所示

    ThreadPool.SetMinThreads(100, 100);
    

    否则,由于池最小大小的默认值为 2,2,您将受到影响,并且任何新线程都需要创建线程的成本(每个开发人员都知道这是最昂贵的过程)。通过执行上述操作,Threadpool 将保持至少 100 个线程准备好工作,您的服务将会摇摆不定。

    因为我已经将腰围从 31 毫秒减少到 6 毫秒。

    【讨论】:

      【解决方案2】:

      您正在执行什么操作?即有效载荷大小是多少?如果您使用非常小的有效负载执行大量操作,那么您显然会受到更多延迟等的影响;但是,带宽也可能是非平凡有效负载的问题。如果您遇到这种情况,您可以尝试不同的序列化程序。让我知道有效载荷大小是否是一个可能的问题,因为那里可能有一些选项。

      还有;您使用什么安全/流媒体/等选项?基于消息的安全性在两端都更昂贵(与传输安全性相比),并且 IIRC 阻止流式传输,因为整个消息必须可用才能验证它。同样,如果您在周围乱扔 blob,您可能会受益于启用 MTOM(可通过 basic-http 实现)和使用流式 API。

      【讨论】:

      • 编辑原始问题请检查感谢您的回复
      【解决方案3】:

      这里有很多问题要问。 Marc 提出了一系列很好的问题,但最终,我想我们无法从您那里获得有关您的程序、平台和网络的足够信息,无法在线为您提供完整的答案。

      如果我处于您的情况,我首先要做的就是进行一些分析,以了解幕后发生的事情。具体来说,我会使用 ProcMon 分析导致网络传输(包括网络传输)的系统活动,以确保网络时间准确。基于这些发现,我要么更深入地了解网络上发生了什么,要么使用 .NET 性能分析器来查看堆栈上的哪些操作花费您最多的时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-11
        • 1970-01-01
        • 2011-07-08
        • 2010-11-24
        • 2010-10-23
        • 2012-03-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多