通过 iperf2 工具测量 Windows PC 和基于 Zynq 的设备之间的 UDP 吞吐量时,我在专用 1Gb 以太网链路上获得了大约 950 Mb/s。但是,当在 PC 上使用我自己的 UDP 应用程序时,我只能获得大约 50 Mb/s,这比 iperf 测量的吞吐量要低得多。当然,在我的 UDP 应用程序中,我没有任何处理,只有我调用 sendto 函数的 while 循环,UDP 数据包大小为 1470 字节。Zynq 设备上的应用程序由 XAPP1026 提供,所以不是我的。我正在查看 iperf 代码,试图找出它们的不同之处,但基本上,我找不到任何套接字或 udp 选项或它们为最大化 UDP 吞吐量所做的任何类似操作。
这是主要功能的代码(MAXUDP定义为1470):
int main(int argc, char** argv)
{
int sockfd;
struct sockaddr_in servaddr;
char sendline[MAXUDP];
int i;
int j;
const int tr_size = ( 200 * MB );
const int npackets = ( tr_size / MAXUDP );
const int neval = 2;
DWORD start;
DWORD end;
int optval;
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2, 1), &wsaData) != 0 )
{
printf( "Err: %d\n", WSAGetLastError() );
exit(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 = Socket(AF_INET, SOCK_DGRAM, 0);
Connect(sockfd, (const SA*) &servaddr, sizeof(servaddr));
optval = 208*KB;
Setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (const char*) &optval, sizeof optval);
prep_data(sendline, MAXUDP);
for ( i = 1; i <= neval; i++ )
{
start = GetTickCount();
for ( j = 0; j < npackets/neval; j++ )
sendto(sockfd, sendline, MAXUDP, 0, NULL, NULL);
end = GetTickCount() - start;
printf("Time elapsed: %d sec.\n", end/1000);
printf("Throughput: %d.%3d MB/s\n", (tr_size/neval)/end/1000, (tr_size/neval)/end - (tr_size/neval)/end/1000);
}
return 0;
}
所以,我的主要问题是如何以与 iperf 相同的方式最大化 UDP 吞吐量?
更新:我切换到 Ubuntu PC。结果不同,但仍然有一些随机的事情发生。我要做的第一件事是为 eth0 ( ifconfig eth0 172.16.0.200 netmask 255.255.255.0
) 和网关地址 ( route add default gw 172.16.0.1
) 设置 IP 地址。当我使用iperf -c 172.16.0.215 -i 5 -t 25 -u -b 1000m
) 运行 iperf 时,我的速度约为 800 Mbits/sec。然而,在以同样的方式运行几次 iperf 之后,突然间我开始只获得大约 15 Mbits/sec 甚至更低的速度。我发现我需要再次设置 IP、网络掩码和网关地址才能获得 800 Mbits/sec。此外,我的 UDP 应用程序的行为方式相同。我正在测量 957 Mbits/sec(使用MAXUDP
设置为 1470)在我运行了设置 IP 地址的命令之后。但经过几次迭代后,它会减慢到 11 Mbits/sec 左右。然后我再次设置 IP 地址,并且行为重演。因此,正如 Kariem 在他的回答中所说,问题不在于代码本身,而在于某些操作系统,netif 配置相关的东西。但是,我必须在 Windows 上运行我的 UDP 应用程序,所以我需要弄清楚那里发生了什么。如果你们对 Windows 中可能发生的事情有任何想法,请现在告诉我。