Hacker News 中文摘要

RSS订阅

始终启用TCP_NODELAY -- It's Always TCP_NODELAY

文章摘要

文章核心内容:作者Marc Brooker指出,在调试分布式系统延迟问题时,经常发现启用TCP_NODELAY选项能快速解决问题,暗示默认的TCP行为已不合时宜,需要改变。

文章总结

标题:总是TCP_NODELAY的问题——每次都是它

作者Marc Brooker是AWS的工程师,专注于数据库和无服务器技术。他在调试分布式系统延迟问题时,首先检查的就是是否启用了TCP_NODELAY选项。这个问题普遍存在,许多系统构建者都曾因此浪费大量时间。

TCP_NODELAY与Nagle算法相关。Nagle算法由John Nagle在1984年提出,旨在解决小数据包导致的网络效率低下问题。例如,单字节数据可能伴随40字节的TCP头,造成巨大开销。Nagle的解决方案是:在未收到之前数据的确认前,不发送新数据。

然而,Nagle算法与TCP的延迟确认(Delayed ACK)机制产生了不良交互。延迟确认会推迟发送ACK,直到有数据需要回传或定时器超时。这种组合导致了延迟敏感型应用的性能问题。Nagle本人也指出,延迟确认的固定计时器设计是问题的根源。

在现代数据中心环境中,Nagle算法的价值受到质疑。单次RTT延迟在数据中心内约为500微秒,跨区域可能达到数百毫秒。现代服务器在这段时间内可以完成大量工作,因此即使只延迟一个RTT也不划算。此外,现代分布式系统很少发送单字节数据包,协议开销(如TLS)和序列化需求使得数据包通常较大。

作者建议,在构建延迟敏感的分布式系统时,应毫不犹豫地启用TCPNODELAY(禁用Nagle算法)。更进一步,他认为在现代系统中,TCPNODELAY应成为默认设置,因为Nagle算法已不再适用当前的网络环境和应用需求。

(注:原文中的个人简介、社交媒体链接、脚注和无关文章推荐等内容已省略,以聚焦技术讨论的核心内容。)

评论总结

以下是评论内容的总结:

支持禁用Nagle算法(TCP_NODELAY)的观点:

  1. 性能提升:多位用户表示禁用Nagle算法能显著减少延迟,尤其是在需要快速响应的场景(如游戏、数据库客户端)。

    • "Fixed instantly with TCP_NODELAY...the latency was much higher than they expected" (评论7)
    • "just turn on TCP_NODELAY and never look back because it solves problems instantly" (评论12)
  2. 技术过时:认为Nagle算法是为过时的网络环境设计,现代点对点网络不再需要。

    • "CSMA is no longer necessary on Ethernet today...Dumping the Nagle algorithm almost always makes sense" (评论3)

对Nagle算法局限性的讨论:

  1. 设计缺陷:指出算法缺乏明确的刷新机制,且与延迟确认(delayed ACK)存在交互问题。

    • "the socket API does not have a function to flush the buffers" (评论11)
    • "both sides set timeouts based on the other side going first...a recipe for disaster" (评论15)
  2. 策略位置争议:认为缓冲策略应由用户态而非内核决定。

    • "putting policy in the kernel where it doesn't really belong...userspace applications can do that with full awareness" (评论4)

替代方案建议:

  1. 通用批处理方案:提出应采用更通用的"Work or Time"批处理策略。

    • "Nagle’s algorithm is just a special case...We want to batch because batching usually allows for more efficient batched algorithms" (评论15)
  2. 协议替代:有建议使用SCTP或UDP替代TCP。

    • "Wouldn't it be nice if...implementations of something like SCTP" (评论11)
    • "Wouldn't distributed systems benefit from using UDP?" (评论14)

其他观点:

  • 语言支持:Go语言已默认启用TCP_NODELAY(评论1)
  • 历史趣闻:波兰语中"nagle"一词意为"突然",与算法效果巧合(评论9)

注:所有评论均无评分(None),但支持禁用Nagle算法的观点占多数。