【问题标题】:Reducing network latency in communication of high volume intranet applications减少大量 Intranet 应用程序通信中的网络延迟
【发布时间】:2011-03-28 00:19:59
【问题描述】:

我们有一组从设备/工具接收测量数据的服务器应用程序。消息传输时间目前是我们的主要瓶颈,因此我们有兴趣减少它以改进流程。工具和服务器应用程序之间的通信是通过在 Redhat Linux 上使用 C++ 创建的 TCP/IP 套接字。

是否可以通过更改 TCP/IP 配置设置或调整 tcp 内核函数来减少使用硬件的消息传输时间? (我们可以牺牲安全性来换取速度,因为通信是在安全的 Intranet 上)

【问题讨论】:

    标签: c++ optimization networking tcp


    【解决方案1】:

    根据工作负载,在套接字连接上禁用Nagle's Algorithm 会有很大帮助。

    在处理大量小消息时,我发现这会产生巨大的影响。

    根据记忆,我相信 C++ 的套接字选项被称为 TCP_NODELAY

    【讨论】:

    • Nagle 的算法是 TCP 的重要组成部分,默认情况下通过一种语言禁用它是完全令人愤慨的。你不记得哪些语言可以做到这一点吗?但在这种特殊情况下,TCP_NODELAY 会完成这项工作,所以 +1
    • @Andy 我以为是 PHP,但我刚刚回去查看大约一年前使用的原型代码,发现该选项被第 3 方类关闭我正在使用 - 当时没有选择它,因为那时我开始调查为什么我的 C++ 套接字比 PHP 的慢:)
    【解决方案2】:

    按照@Jerry Coffin 的建议,你可以切换到UDP。 UDP 是不可靠的协议,这意味着您可能会丢失数据包,或者它们可能以错误的顺序到达,或者被复制。因此,您需要在应用程序级别处理这些情况。由于您可能会丢失一些数据(如您在评论中所述),因此无需重新传输(任何可靠协议中最复杂的部分)。您只需要丢弃过时的数据包。使用简单的序列号就完成了。

    是的,您可以使用 RTP(它具有序列号),但您不需要它。对于您的简单案例,RTP 看起来有点矫枉过正。它还有许多其他功能,主要用于多媒体流。

    [EDIT] 和类似问题here

    【讨论】:

      【解决方案3】:

      在硬件方面尝试Intel Server NICs 并确保TCP offload Engine (ToE) 已启用。

      还有一个重要的决定是在延迟和goodput 之间做出决定,如果您想以牺牲吞吐量为代价获得更好的延迟,请考虑减少中断合并周期。有关更多详细信息,请参阅英特尔文档,因为它们提供了相当多的可配置参数。

      【讨论】:

        【解决方案4】:

        如果可以的话,减少延迟的明显步骤是从 TCP 切换到 UDP。

        【讨论】:

        • 实际上会使性能变差,因为 TCP 通常比 UDP 加速更多。与是否需要可靠性高度相关。
        • 我们可以丢失 2-3% 的数据,因为它是测量数据。也可以使用RTP(实时协议)吗?
        • @Steve-o:关于这种加速的任何信息?我无法想象这将如何完成,因为 TCP 主要(忽略小事)是 UDP 上的重量级包装器。 @fruit_trader:关于 RTP 在单独的答案中
        【解决方案5】:

        是的。

        谷歌“TCP 帧大小”了解详情。

        【讨论】:

        • 好的答案不仅仅是“用这个短语去谷歌”。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-07
        • 2020-01-13
        • 2016-07-12
        • 2018-12-06
        相关资源
        最近更新 更多