2016-05-09 7 views
0

Ich schrieb ein sehr einfaches Programm, dass ein PC tun Udp sendto, und ein anderer PC tun recvfrom. Bei einer 1 Gbit/s Ethernet-Verbindung kostet die Senderseite 13% CPU, aber die Empfängerseite kostet nur 5%.
Wer weiß, warum sendto so viel teurer als recvfrom, und jede gute Idee, die Senderkosten zu reduzieren, vielen Dank!
Hauptcode:warum sendto kostet viel mehr als recvfrom

while (1) 
{ 
    static int sendLen = 0; 
    sendLen = sendto(socketfd, buffer, buflen, 0, (struct sockaddr *)&dest, sizeof(dest)); 

    totalSize += sendLen; 
    ++loopcnt; 
    totalsend++; 

    if (loopcnt == COUNTNUM) 
    { 
     clock_gettime(0, &end); 
     unsigned int timecost = 1000 * (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec)/1000000; //ms 
     double timecost_double = 1000 * (end.tv_sec - start.tv_sec) + ((double)(end.tv_nsec - start.tv_nsec))/1000000; 

     printf("UDP APP TX %.1f M bps. PPS %.1f pps packet size:%d, timecost=%.lf\n", (float)(totalSize * 8)/(timecost_double * 1000), 
      (float)(loopcnt*1000)/(timecost), buflen, timecost_double);      //timecost ms 

     start = end; 
     totalSize = 0; 
     loopcnt = 0; 

    } 


} 
+0

Wie haben Sie das Profil erstellt, um die CPU-Auslastung zu ermitteln, und wie haben Sie die Gesamtnutzung im Verhältnis zur Dauer angepasst? Dies kann ein Fall von lokalem Cache sein, der es Ihnen erlaubt, schneller vor einem Senden zu schreiben, während Ihre CPU nicht so beschäftigt ist, da sie auf jedes empfangene Paket warten muß. Es kann auch hilfreich sein, den Code zu veröffentlichen, falls es weitere Gründe dafür gibt, wie Sie Ihre Verbindung verwalten. –

+0

Ich benutze nur 'top -H', um die CPU-Auslastung zu überprüfen. – Patrick

Antwort

0

Wenn Sie nicht connect im Sender rufen Sie hat jeder Aufruf sendto eine implizite temporäre Verbindungsoperation zu tun, es viel teurer machen. Fügen Sie im Absender einen connect-Aufruf hinzu und beobachten Sie, wie die CPU-Nutzung abbricht.

+0

Ich füge eine Verbindung hinzu und benutze send anstelle von sendto, nun sinkt die CPU-Auslastung von 13% auf 11%, aber immer noch viel höher als recvfrom – Patrick

+0

Mach etwas Profiling, um zu sehen, was die CPU macht. –

+0

I 'perf top' verwenden, um die heißen Funktionen zu zeigen, sind die Spitzen: 13.90% [kernel] [k] csum_partial_copy_generic 9,97% [kernel] [k] __ticket_spin_lock 3,97% [kernel] [k] fib_table_lookup 3,56% [ tg3] [k] tg3_start_xmit – Patrick

Verwandte Themen