从客户端到服务器建立1000个TCP / IP连接的延迟

时间:2014-06-24 08:21:20

标签: c linux sockets tcp latency

我想与服务器建立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个连接的速率非常缓慢地建立。

为了在几毫秒内建立所有1000个连接,client.c应该做些什么?为什么8192的积压不允许客户建立1000个连接?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

接受连接后,阅读&amp;必须从不同的线程执行write,以便接受调用的次数会变得更高。阅读&amp;写是阻止呼叫&amp;它需要一些CPU时间才能完成。移动插座读取&amp;写入不同的线程&amp;然后检查接受的连接数。