【问题标题】:Is the Nagle algorithm in WCF/SOAP useful at all?WCF/SOAP 中的 Nagle 算法是否有用?
【发布时间】:2013-01-02 10:08:29
【问题描述】:

我看过很多关于在 Azure 上工作时在 WCF 中禁用 Nagle 算法的帖子。我一直想知道这是否仅适用于 Azure,或者这是否应该是更通用的最佳实践。

如各种来源所述,Nagle 算法基本上将小型 TCP 请求分批成单个较大的请求。批处理基于每个连接进行。

我在专业环境中看到的大多数 WCF 传输都是小数据块,由单个线程发送,并且大多是双向的。我知道这并不是 Nagle 算法的理想情况。

所以...我的结论是否正确,即无论上下文如何,在使用 WCF 或 SOAP 时最好简单地始终禁用它?

【问题讨论】:

    标签: .net wcf network-programming nagle


    【解决方案1】:

    据我了解,Nagle 的算法仅在数据以小于网络吞吐量的速率以小块形式流式传输时才真正有用。例如,如果它是来自某些硬件传感器的视频馈送或恒定输出(实时无关紧要,但历史很重要)。 想象一下极端情况——所有这些数据都是在没有 Nagle 算法的情况下逐字节发送的,实际上是流量乘以 41。

    相反,当数据以一大块写入(SOAP 请求)然后以一大块接收(SOAP 响应)时,它当然没有用,甚至有害(由于延迟)。因此建议关闭它。

    因此,我们可以得出结论,对于流应用程序(文件、视频、恒定数据馈送),Nagle 算法应该保留,除非实时处理很重要(控制台终端)。它基本上是应用程序的“良好行为准则”,不要让无用的流量阻塞通道(这可能是网络负载重的大型数据中心的问题)。 如果通信是在请求-响应模式下完成的(即:所有数据一次写入缓冲区 - 所以 Nagle 算法无效),您可以默认关闭它。

    【讨论】:

    • 是的,这正是我的推理。据我所知,所有(专业)WCF 服务中有 99% 用于构建 SOA——这意味着双向通信(由于 f.ex. 例外)。这表明 Nagle 弊大于利,因此默认的“no nagle”似乎是合适的。
    • 是的,基本上就是这样。只是一个小修正:选择的二分法不是“双向 vs 一种方式”,而是“流式传输 vs. 请求-响应”。
    • 好的,我明白你的意思了。使用单向与双向的原因是因为 OperationContract 属性中的“IsOneWay”属性 - 在我的经验中很少使用。
    • 在没有任何反驳论据的情况下,我将奖励你赏金。我从所有这些中发现的总体结论是除非你有充分的理由,否则应该简单地关闭 Nagle 以用于 WCF(这个充分的理由是流处理,这可能是大多数使用 WCF 的人不会做)。谢谢。
    【解决方案2】:

    对于使用大量小型(TCP/HTTP 级别)消息的协议,应关闭 Nagle。我认为总是这样做是不行的。

    还请注意,WCF 并不一定意味着 SOAP。这取决于使用的绑定。消息大小还取决于使用的编码。 WCF 是非常可配置的。

    WCF 可以使用例如 JSON。因此,假设您在 WCF+JSON+REST 上构建了一个服务器应用程序,并且平均 JSON 有效负载很小(例如,小于 1500 字节,这意味着大约 1500 个字符,因为 JSON 默认使用 UTF-8),比它可能值得。

    但是,如果您的应用程序正在使用 SOAP 绑定,并且您测量到平均消息大小超过 1500 字节(坦率地说,这对于 SOAP XML 有效负载来说似乎是可能的),那就不值得了。

    所以,恕我直言,您确实需要在做出决定之前衡量一些事情 - 就像 Azure 的人所做的那样,好吧,也许他们是在 :-) 之后做的。测量 HTTP 消息大小的一种简单方法是使用Fiddler2,尤其是统计选项卡(选择所有消息,它将为您提供总帧数和总字节数)。

    【讨论】:

    • 关于配置部分是正确的,但是由于它的双向通信,它仍然是在一个块中发送的。因此,即使有效负载很大,使用 nagle 似乎也没有任何好处 - 在最坏的情况下它会延迟,在最好的情况下不会增加任何东西。对吗?
    • 如果payload很大就什么都不加,yes(为了简化),所以重点是判断payload是否很大。这都是关于“如果”的问题。您仍然可以使用 WCF 获得较小的有效负载。 WCF 并不意味着大的有效负载。这就是我的观点。
    • 是的,但据我了解,在流式环境中使用 WCF 创建大量小型有效负载非常难创建。所以我向您提出挑战:您能否向我展示一个使用 WCF 并受益于 Nagle 的常用服务合同/代码段?
    • 我称之为“把钱放在嘴边”。到目前为止,我已经看过很多网站和理论,但我测试过的所有东西都证明,在处理这样的服务时,这些理论是完全错误的。我很高兴承认我错了,并且肯定愿意编写代码,但想要一些证据。
    猜你喜欢
    • 2012-03-29
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    相关资源
    最近更新 更多