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;
}
}
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. –
Ich benutze nur 'top -H', um die CPU-Auslastung zu überprüfen. – Patrick