當使用iperf2工具測量Windows PC和基於Zynq的設備之間的UDP吞吐量時,我通過專用1Gb以太網鏈路獲得約950 Mb/s的吞吐量。但是,在PC上使用我自己的UDP應用程序時,我只能獲得大約50 Mb/s的吞吐量,這比iperf測得的吞吐量大大降低。當然,在我的UDP應用程序中,我沒有任何處理,只有在我調用sendto函數的循環中,使用大小爲1470字節的UDP數據包。 Zynq設備上的應用程序由XAPP1026提供,所以它不是我的。我正在查看iperf代碼,試圖弄清楚他們做了什麼不同,但基本上,我找不到任何套接字或udp選項或類似的工具,以最大化UDP吞吐量。與iperf UDP性能相比,UDP吞吐量較低
這裏是main函數的代碼(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;
}
所以,我的主要問題是如何最大限度地發揮UDP的吞吐量以同樣的方式iperf的不是嗎?
更新: 我切換到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應用程序的行爲方式也是一樣的。我在運行設置IP地址的命令後測量了957 Mbits/sec(其中MAXUDP
設置爲1470)。但經過幾次迭代後,它會減慢到11 Mbits/sec左右。然後我再次設置IP地址,並且行爲重複。因此,正如Kariem在他的回答中所述,問題不在於代碼本身,而在於某些操作系統,netif配置相關的東西。但是,我必須在Windows上運行我的UDP應用程序,所以我需要弄清楚發生了什麼。如果您對Windows中可能發生的情況有任何想法,請立即告訴我。
請張貼您的代碼。我會幫你的。 – Kariem
你是說你用一個1470字節*有效載荷*發送UDP數據報,或者你的數據包是*總體* 1470字節大小? (注意:如果您提供[mcve],那麼這是一個我們不需要提出的問題的例子,正如我們通常的預期那樣)。 –
我已經添加了代碼,所以現在情況會更加清晰。另外,當我把MAXUDP設置爲1470而不是14700(而且我只是試驗)時,我剛剛發現,我正在達到550 Mb/s。混亂也在增加。 – Irie