【问题标题】:WCF with netNamedPipeBinding bad performance带有 netNamedPipeBinding 的 WCF 性能不佳
【发布时间】:2012-01-25 20:07:43
【问题描述】:

我正在使用带有 netNamedPipeBinding 的 WCF 服务将大量数据(非常长的对象列表)传输到客户端(当然是在同一台机器上)。 问题是整个调用需要大约 20 秒来传输约 250MB 的数据,即每秒大约 10+MB。我预计共享内存时传输速率会快得多。有谁知道如何提高我的性能和传输率? 这是我的 app.config 文件:

      <netNamedPipeBinding>
    <binding name="NetNamedPipeBinding_IDataService" closeTimeout="00:10:00"
      openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"
      transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
      hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647"
      maxBufferSize="2147483647" maxConnections="10" maxReceivedMessageSize="2147483647">
      <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647"
        maxBytesPerRead="4096" maxNameTableCharCount="2147483647" />
      <security mode="Transport">
        <transport protectionLevel="None" />
      </security>
    </binding>
  </netNamedPipeBinding>

非常感谢!

【问题讨论】:

  • 共享内存非常快,但是命名管道不是共享内存。
  • 好的。你是正确的,但不要介意绑定的后端实现。这些速率是我对基本 http 绑定而不是命名管道绑定的期望,后者应该更快。
  • 您如何衡量吞吐量?您确定这真的是数据传输时间,而不是“非常长的对象列表”的序列化/反序列化吗?

标签: wcf performance netnamedpipebinding


【解决方案1】:

就像 cmets 所说的,可能不是传输速率导致问题,而是序列化。

有 3 件事需要考虑:

  • 序列化和反序列化的 CPU 使用率
  • 对象在内存中的保存
  • 传输速率

要发送超过 250 MB 的数据,首先会对其进行序列化,然后发送过来,然后再进行反序列化。这可能会在内存中产生 3 个数据副本,从而导致磁盘抖动。

几年前我们遇到过类似的问题,最终切换到直接调用 dll,将内存引用传递给列表需要 ca. 1 毫秒。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多