代码之家  ›  专栏  ›  技术社区  ›  Mubashar

WCF-网络成本

  •  2
  • Mubashar  · 技术社区  · 16 年前

    我在IIS上部署了一个wcf服务,basichttpbinding和aspnetcompatibilityEnabled=true

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

    经过8小时的测试(服务器和客户机在同一台机器上),我了解到客户机上的平均响应时间约为34ms,因为服务器上的平均执行时间约为3ms,所以差异为31ms。

    我想知道为什么每通电话都要打31毫秒,这是合理的吗?我怎样才能减少这个呢?

    编辑:回复“Marc Gravell”后

    1. 在IIS中启用了SSL在WCF级别上没有其他安全性
    2. 服务执行小型数据库操作您可以通过给定的3ms平均执行时间估计操作成本。(如果这就是你所说的有效载荷)
    3. 没有blob,没有mtom
    4. 发送和接收消息不大,可能在100字节到500字节之间,简单的消息契约
    5. 如果还有什么需要诊断的请告诉我
    6. 实际上,如果您能解释WCF如何执行TCP连接作业,以及它与可用的不同绑定之间是否存在任何差异,那么我更关心建立TCP连接的成本。
    3 回复  |  直到 16 年前
        1
  •  3
  •   Mubashar    16 年前

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

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

    ThreadPool.SetMinThreads(100, 100);
    

    否则,由于池最小大小的默认值为2,2,您将受到影响,任何新线程都需要创建线程的成本(每个开发人员都知道这是最昂贵的进程)。通过这样做,线程池将保持至少100线程准备工作,您的服务将摇滚。

    因为我已经把腰围从31ms减到了6ms。

        2
  •  2
  •   Marc Gravell    16 年前

    你在做什么手术?即,有效载荷大小是多少?如果您使用非常小的有效负载执行大量的操作,那么显然您将遭受更多的延迟等问题;但是 带宽 也可能是非平凡有效负载的问题。如果您遇到这种情况,可以尝试其他序列化程序。请告诉我这里的有效负载大小是否是一个可能的问题,因为那里可能有一些选项。

    另外,您使用的是什么安全/流式处理/etc选项?基于消息的安全性在两端都更昂贵(与传输安全性相比),并且IIRC块流式传输作为整个消息必须是可用的,以便验证它。同样,如果您在周围抛出blob,那么您可能会受益于启用MTOM(这在基本HTTP上是可行的)和使用流式API。

        3
  •  0
  •   The Quantum Physicist    16 年前

    这里有很多问题要问。马克首先提出了一系列好的问题,但最终,我想我们将无法从你那里获得关于你的程序、平台和网络的足够信息,从而无法在网上给你一个完整的答案。

    如果我在你的情况下,我会做的第一件事是进行一点分析,以了解下面发生了什么。具体来说,我将使用procmon来分析网络传输之前和包括网络传输在内的系统活动,以确保网络时间精确。基于这些发现,我要么深入研究网络上的情况,要么使用.NET性能分析器来查看堆栈上的哪些操作会花费您最大的时间。

    推荐文章