为什么我的tcp带宽只有iperf3的1/3?

问题描述 投票:0回答:1
#include <netinet/in.h>
#include <pthread.h>
#include <sys/types.h>         
#include <sys/socket.h>
#include <assert.h>

static int create_local_sock(void)
{
    struct sockaddr_in un;
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    memset(&un, 0, sizeof(un));
    un.sin_family = AF_INET;   
    un.sin_port = htons(8888);
    un.sin_addr.s_addr = 0;
    if(bind(sockfd, (struct sockaddr *)&un, sizeof(un))<0){
        assert(0);
    }
    listen(sockfd, 10);

    return sockfd; 
}
ssize_t prev_recv, curr_recv;
void *print_fun(void *arg)
{
    while(1){
        sleep(1);
        ssize_t curr_recv1 = curr_recv;
        printf("Recv %d MB/s\n", (curr_recv1 - prev_recv)/1024/1024);
        prev_recv = curr_recv1;
    }
}
int s_main(int argc, char **argv)
{
    char buf[2048];
    int fd = create_local_sock();
    pthread_t thr;
    pthread_create(&thr, NULL, print_fun, NULL);
    while(1){
        int client = accept(fd, NULL, NULL);
        while(1){
            ssize_t len = recv(client, buf, sizeof(buf), 0);
        if(len > 0){
            curr_recv += len;
        }else{
            break;
        }
        }

    }
}

ssize_t prev_send, curr_send;
void *print_fun_c(void *arg)
{
    while(1){
        sleep(1);
        ssize_t curr_send1 = curr_send;
        printf("Send %d MB/s\n", (curr_send1 - prev_send)/1024/1024);
        prev_send = curr_send1;
    }
}

int c_main(int argc, char **argv)
{
    char buf[2048];
    struct sockaddr_in un;
    int fd = socket(AF_INET, SOCK_STREAM, 0);
    memset(&un, 0, sizeof(un));
    un.sin_family = AF_INET;   
    un.sin_port = htons(8888);
    un.sin_addr.s_addr = inet_addr(argv[1]);
    connect(fd, (struct sockaddr*)&un, sizeof(un));
    pthread_t thr;
    pthread_create(&thr, NULL, print_fun_c, NULL);
    while(1){
        ssize_t len = send(fd, buf, 1400, 0);
        if(len > 0){
            curr_send += len;
        }else{
            break;
        }
    }
}

int main(int argc, char **argv){
    if(strcmp(argv[1], "s")==0) return s_main(argc,argv);
    return c_main(argc,argv);
}

我有一个简单的 TCP 接收服务器和客户端,它们都尽可能快地循环接收/发送数据包。我使用的payload 1400看起来mtu是1500。在实际测试中,吞吐量只有iperf3的1/3。 我不明白为什么会有这么大的差异。 我检查了cpu使用情况。非常相似。是什么影响了我的表现?

linux performance tcp
1个回答
0
投票

为那些可能阅读这个(相对较旧的)问题的人提供的信息。 iperf3 使用的默认 TCP 消息大小是 128KB。因此,每条消息仅发送 1400 字节的开销要高得多。这可能是问题的根源。

© www.soinside.com 2019 - 2024. All rights reserved.