Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 与iperf UDP性能相比,UDP吞吐量较低_C_Sockets_Networking_Udp_Iperf - Fatal编程技术网

C 与iperf UDP性能相比,UDP吞吐量较低

C 与iperf UDP性能相比,UDP吞吐量较低,c,sockets,networking,udp,iperf,C,Sockets,Networking,Udp,Iperf,通过iperf2工具测量Windows PC和基于Zynq的设备之间的UDP吞吐量时,我在专用1Gb以太网链路上的吞吐量约为950 Mb/s。然而,当在PC上使用我自己的UDP应用程序时,我只能获得大约50MB/s的吞吐量,这比iperf测量的吞吐量要低得多。当然,在我的UDP应用程序中,我没有任何处理,只有在调用sendto函数的循环中,UDP数据包的大小为1470字节。Zynq设备上的应用程序是由XAPP1026提供的,所以它不是我的。我正在查看iperf代码,试图找出它们的不同之处,但基本

通过iperf2工具测量Windows PC和基于Zynq的设备之间的UDP吞吐量时,我在专用1Gb以太网链路上的吞吐量约为950 Mb/s。然而,当在PC上使用我自己的UDP应用程序时,我只能获得大约50MB/s的吞吐量,这比iperf测量的吞吐量要低得多。当然,在我的UDP应用程序中,我没有任何处理,只有在调用sendto函数的循环中,UDP数据包的大小为1470字节。Zynq设备上的应用程序是由XAPP1026提供的,所以它不是我的。我正在查看iperf代码,试图找出它们的不同之处,但基本上,我找不到任何套接字或udp选项或任何类似的选项,以最大限度地提高udp吞吐量

以下是主函数的代码(MAXUDP定义为1470):

int main(int argc,char**argv)
{
int-sockfd;
servaddr中的结构sockaddr_;
字符发送线[MAXUDP];
int i;
int j;
常量int tr_size=(200*MB);
const int npackes=(tr_size/MAXUDP);
内瓦尔常数=2;
德沃德起动;
德沃德端;
int optval;
WSADATA WSADATA;
if(WSAStartup(MAKEWORD(2,1),&wsaData)!=0)
{
printf(“错误:%d\n”,WSAGetLastError());
出口(1);
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(SERV_port);
servaddr.sin_addr.s_addr=inet_addr(“172.16.0.215”);
sockfd=插座(AF_INET,SOCK_DGRAM,0);
连接(sockfd,(const SA*)和servaddr,sizeof(servaddr));
optval=208*KB;
Setsockopt(sockfd,SOL_SOCKET,SO_SNDBUF,(const char*)和optval,optval的大小);
准备数据(发送线、MAXUDP);

对于(i=1;i您计算吞吐量的方式有一个错误。您的大小是以字节为单位设置的,因此您以字节为单位计算吞吐量,而iperf以位为单位

改变

printf("Throughput: %d.%3d MB/s\n", (tr_size/neval)/end/1000, (tr_size/neval)/end - (tr_size/neval)/end/1000);
对此

printf("Throughput: %d.%3d MB/s\n", ((tr_size/neval)/end/1000)*8, (tr_size/neval)/end - ((tr_size/neval)/end/1000)*8);
我在我的机器上运行了一个版本的代码,我得到了1GB的吞吐量

#include <netinet/in.h>
#include <string.h>
#include <sys/time.h>
#include <cstdio>
#include <arpa/inet.h>
#include <fcntl.h>

#define MAXUDP 1470
#define SERV_PORT 5001
static inline long int getCurTimeInMs()
{
    struct timeval tp;
    gettimeofday(&tp, NULL);
    return tp.tv_sec * 1000 + tp.tv_usec / 1000;

}


int main(int argc, char** argv)
{
    int sockfd;
    struct sockaddr_in servaddr;
    char sendline[MAXUDP];
    int i;
    int j;
    const int tr_size = ( 10000 * 1024*1024 );
    const int npackets = ( tr_size / MAXUDP );
    const int neval = 2;

    int optval;

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(SERV_PORT);

        servaddr.sin_addr.s_addr = inet_addr("10.0.1.2");

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);


    connect(sockfd, (const sockaddr*) &servaddr, sizeof(servaddr));


    optval = 208*1024;
    setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (const char*) &optval, sizeof optval);
    long int start = 0, end = 0;
    for ( i = 1; i <= neval; i++ )
    {
        start = getCurTimeInMs();
        for ( j = 0; j < npackets/neval; j++ )
            sendto(sockfd, sendline, MAXUDP, 0, NULL, NULL);
        end = getCurTimeInMs() - start;

        printf("Time elapsed: %d sec.\n", end/1000);
        printf("Throughput: %d.%3d MB/s\n", (tr_size/neval)/end/1000 * 8, (tr_size/neval)/end - (tr_size/neval)/end/1000);

    }
    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义MAXUDP 1470
#定义服务端口5001
静态内联长整型getCurTimeInMs()
{
结构timeval-tp;
gettimeofday(&tp,NULL);
返回tp.tv_sec*1000+tp.tv_usec/1000;
}
int main(int argc,字符**argv)
{
int-sockfd;
servaddr中的结构sockaddr_;
字符发送线[MAXUDP];
int i;
int j;
常量int tr_size=(10000*1024*1024);
const int npackes=(tr_size/MAXUDP);
内瓦尔常数=2;
int optval;
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(SERV_port);
servaddr.sin_addr.s_addr=inet_addr(“10.0.1.2”);
sockfd=插座(AF_INET,SOCK_DGRAM,0);
连接(sockfd,(const sockaddr*)和servaddr,sizeof(servaddr));
optval=208*1024;
setsockopt(sockfd,SOL_SOCKET,SO_SNDBUF,(const char*)和optval,optval的大小);
长整数开始=0,结束=0;

对于(i=1;i为什么定义MAXUDP 1470?请尝试将其设置为65535,再次测量并在此处报告


您不应该混淆以太网帧大小(1500字节)使用UDP数据报大小。不同的事情。让IP堆栈执行必要的分段,而不是应用程序。这可能会更有效。

请发布您的代码。这会有所帮助。您是说您发送的UDP数据报的有效负载为1470字节,还是说您的数据包的总大小为1470字节?(注意:这是一个例子,如果您提供了一个,我们就不需要提出这种问题,这是我们通常的期望。)我已经添加了代码,所以现在事情会更清楚了。另外,我刚刚发现,当我将MAXUDP设置为1470,而不是14700时(嗯,我只是在试验),我的速度高达550 Mb/s。混乱程度也越来越高。@Irie:检查
sendto()
!这就是如何计算实际发送的字节数,而不是丢弃的字节数。
send()
并不总是发送您要求发送的所有字节,因此当您设置大的缓冲区大小时,您可能测量到的是错误的。虽然我想这可能解释了当MAXUDP增加到14700时吞吐量明显增加的原因。我不会说这是错误的。例如,当我总共传输100 MB时,我会得到时间延迟sed约为15秒,吞吐量约为6.6 MB/s,这非常合理。此外,当查看Wireshark中的统计数据时,我需要大约16秒来传输71250个UDP数据包,每个数据包大小为1514字节(71250*1514=107872500(~100MB)).71250*1514/16约为6,7 MB/s。如果以每秒字节数计算吞吐量,则数字是正确的,但iperf不是这样做的。iperf以每秒比特数计算吞吐量,因此它将是计算吞吐量的8倍。MBPS代表每秒兆比特数。是的,这意味着我在本例中得到的是6.6*1024*1024*8 Mb/s,即55 Mb/s。这是我在原始帖子中说的。这个结果与iperf测量的950 Mb/s相去甚远。我根据你的代码,所以如果你在最后手动乘以8以获得比特/秒的吞吐量,那就足够了。正如我在回答中所说的,我测试了你的代码,得到了1 GBPS,这是我的以太网线,很明显你的代码没有问题。唯一的其他理由是你的代码由于某些原因运行得不够频繁。尝试以更高的优先级运行它,并尝试将你的套接字设置为非阻塞。是的,我是手动执行的。感谢你尝试代码!我猜你是在测量t到t之间的吞吐量wo PC或另一端在其他设备上运行?我将尝试将套接字设置为非阻塞,但我不知道如何使其以更高的优先级运行。如果您对此有任何参考资料,我将不胜感激。我也这样做了。在Windows上,我将达到695 Mbits/秒。但是,Windows上的iperf是sending 1470字节的数据报,每秒超过900 Mbits。我不知道如何解释。在Ubuntu上运行我的应用程序时,我是g
#include <netinet/in.h>
#include <string.h>
#include <sys/time.h>
#include <cstdio>
#include <arpa/inet.h>
#include <fcntl.h>

#define MAXUDP 1470
#define SERV_PORT 5001
static inline long int getCurTimeInMs()
{
    struct timeval tp;
    gettimeofday(&tp, NULL);
    return tp.tv_sec * 1000 + tp.tv_usec / 1000;

}


int main(int argc, char** argv)
{
    int sockfd;
    struct sockaddr_in servaddr;
    char sendline[MAXUDP];
    int i;
    int j;
    const int tr_size = ( 10000 * 1024*1024 );
    const int npackets = ( tr_size / MAXUDP );
    const int neval = 2;

    int optval;

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(SERV_PORT);

        servaddr.sin_addr.s_addr = inet_addr("10.0.1.2");

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);


    connect(sockfd, (const sockaddr*) &servaddr, sizeof(servaddr));


    optval = 208*1024;
    setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (const char*) &optval, sizeof optval);
    long int start = 0, end = 0;
    for ( i = 1; i <= neval; i++ )
    {
        start = getCurTimeInMs();
        for ( j = 0; j < npackets/neval; j++ )
            sendto(sockfd, sendline, MAXUDP, 0, NULL, NULL);
        end = getCurTimeInMs() - start;

        printf("Time elapsed: %d sec.\n", end/1000);
        printf("Throughput: %d.%3d MB/s\n", (tr_size/neval)/end/1000 * 8, (tr_size/neval)/end - (tr_size/neval)/end/1000);

    }
    return 0;
}