【问题标题】:Latency of establishing 1000 TCP/IP connections from client to server从客户端到服务器建立 1000 个 TCP/IP 连接的延迟
【发布时间】:2014-08-14 10:06:48
【问题描述】:

我想与服务器建立 1000 个连接。只有在建立所有连接后,我才想开始在连接上发送或接收数据。

服务器很简单,它只是接受连接,然后按顺序执行读取和写入。服务器有 8192 的积压,并在从第一个连接读取时阻塞:

// Why doesn't backlog of 8192 allow the client to establish 1000 connections?
listen(serversocket, 8192);
while(1) {
    struct sockaddr_in client_addr;
    socklen_t client_addr_len = sizeof(client_addr);
    int fd = accept(serversocket, (struct sockaddr*)&client_addr, &client_addr_len);

    // This blocks the server on a read from the 1st connection
    short data1;
    read(fd, &data1, sizeof(data1));

    char data2[32];
    write(fd, data2, sizeof(data2));

    close(fd);
}

客户端包含以下代码:

int sockfds[1000];
int i;
for(i=0; i<1000; i++) {
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    sockfds[i] = sockfd;

    struct sockaddr_in servaddr;
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    servaddr.sin_port = htons(5678);

    connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr));
    printf("%d: connected\n", i);
}

// ... read from sockfds[j], write to sockfds[j]

前 130 个连接在几毫秒内建立。但是,连接 130...999 的建立速度非常缓慢,速度约为每秒 1 个连接。

client.c 应该怎么做才能在几毫秒内建立所有 1000 个连接?为什么8192的backlog不允许客户端建立1000个连接?

【问题讨论】:

  • 为什么?为什么不一有连接就开始使用呢?为什么是1000?服务器真的能处理1000个连接吗?
  • 这是一个服务器基准测试。基本上,服务器以listen(serversocket, 8192) 开始,然后在while 循环中执行accept(serversocket, ...)
  • 我检查了服务器。它实际上无法处理 1000 个连接,但我认为在服务器上积压 8192 将允许客户端建立 1000 个连接。似乎上一句中的假设是不正确的。
  • 您确定客户端确实在建立连接吗?我在该代码中没有看到错误检查。
  • @Atom 你能展示一下演示问题的真实代码吗?以防万一被删除的东西是造成缓慢的原因。

标签: c linux sockets tcp latency


【解决方案1】:

解决方法是将/proc/sys/net/core/somaxconn 设置为大于1000的值。

默认值为 128。这解释了为什么客户端在与服务器建立大约 130 个连接后会遇到延迟增加。

【讨论】:

    【解决方案2】:

    接受连接后,必须从不同的线程执行读取和写入,以便调用接受调用的次数会更高。读写阻塞调用,需要一些 CPU 时间才能完成。将套接字读写移动到不同的线程,然后检查接受的连接数。

    【讨论】:

      猜你喜欢
      • 2021-11-06
      • 2021-08-07
      • 2013-06-06
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 2018-12-30
      • 2019-07-03
      • 2013-05-07
      相关资源
      最近更新 更多