TCP / IP以太网网络的延迟

Modified on: Sat, 20 Jul 2019 15:20:02 +0800

您会推荐哪些资源(书籍,网页等):

  • 解释TCP / IP-Ethernet网络中延迟的原因;
  • 提供用于查找导致延迟的内容的工具(例如netstat -s中的某些条目);
  • 提出了调整Linux TCP堆栈以减少TCP延迟的方法(Nagle,套接字缓冲区等)。

我最了解的是此文档,但它是相当简短。

或者,欢迎您直接回答上述问题。

编辑要明确,问题不仅仅是“异常”延迟,而是一般的延迟问题。此外,它特别是关于以太网上的TCP / IP而不是其他协议(即使它们具有更好的延迟特性。)

作者:,NPE

最佳答案

关于延迟的内核可调参数,请记住:

echo 1 > /proc/sys/net/ipv4/tcp_low_latency

来自文档

  

如果设置,TCP堆栈会做出更低的决策
          延迟而不是更高的吞吐量。默认情况下,这个
          选项未设置意味着更高的吞吐量是首选。
          应用此默认值的应用程序示例
          更改将是Beowulf计算群集。
          默认值:0

您还可以在应用程序中禁用Nagle算法(这将缓冲TCP输出直到最大段大小),例如:

#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <linux/tcp.h>

int optval = 1;
int mysock;

void main() {
    void errmsg(char *msg) {perror(msg);exit(1);}

    if((mysock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
        errmsg("setsock failed");
    }

    if((setsockopt(mysock, SOL_SOCKET, TCP_NODELAY, &optval, sizeof(optval))) < 0) {
        errmsg("setsock failed");
    }

    /* Some more code here ... */

    close(mysock);
}

此选项的“相反”是TCP_CORK,它将“重新Nagle”数据包。但要注意,因为TCP_NODELAY可能并不总能达到预期效果,并且在某些情况下可能会损害性能。例如,如果要发送批量数据,则需要最大化每个数据包的吞吐量,因此请设置TCP_CORK。如果您的应用程序需要立即交互(或者响应比请求大得多,否定开销),请使用TCP _NODELAY。另请注意,此行为是特定于Linux的,并且BSD可能不同,因此告诫管理员

确保使用您的应用程序和基础架构进行全面测试。

作者:,Sam Halicke

相关问答

添加新评论