Ursachen von Linux UDP packet drops

Ich habe einen Linux-C++ - Anwendung, die erhält sequenziert UDP-Pakete. Wegen der Sequenzierung, kann ich leicht feststellen, wenn ein Paket verloren gegangen ist oder neu bestellt werden, D. H. wenn eine "Lücke" gefunden wird. Das system verfügt über eine recovery-Mechanismus zu behandeln Lücken, aber es ist am besten, um Lücken zu vermeiden in den ersten Platz. Mit einem einfachen libpcap-basierten packet-sniffer habe ich festgestellt, dass es keine Lücken in den Daten auf hardware-Ebene. Jedoch, ich sehe eine Menge Lücken in meiner Anwendung. Dies legt nahe, die kernel-Pakete verliert; es wird bestätigt durch die Betrachtung der /proc/net/snmp - Datei. Wenn mein Antrag auf eine Lücke, die Udp InErrors Zähler erhöht.

Auf der system-Ebene, wir haben erhöht die max receive buffer:

# sysctl net.core.rmem_max
net.core.rmem_max = 33554432

Ebene der Anwendung, wir haben erhöht die Empfangs-Puffer-Größe:

int sockbufsize = 33554432
int ret = setsockopt(my_socket_fd, SOL_SOCKET, SO_RCVBUF,
        (char *)&sockbufsize,  (int)sizeof(sockbufsize));
//check return code
sockbufsize = 0;
ret = getsockopt(my_socket_fd, SOL_SOCKET, SO_RCVBUF, 
        (char*)&sockbufsize, &size);
//print sockbufsize

Nach dem Aufruf von getsockopt () wird der Wert aufgedruckt ist, immer 2x was eingestellt ist (67108864 im Beispiel oben), aber ich glaube, das ist zu erwarten.

Ich weiß, dass das Versäumnis, Sie zu konsumieren, die Daten schnell genug, können in der Folge zu Paketverlusten. Jedoch, alle diese Anwendung tut, ist zu überprüfen die Sequenzierung, drücken Sie dann die Daten in eine Warteschlange; die eigentliche Verarbeitung erfolgt in einem anderen thread. Darüber hinaus die Maschine ist modern (dual Xeon X5560, 8 GB RAM) und sehr leicht beladen. Wir haben buchstäblich Dutzende von identischen Anwendungen empfangen von Daten an einem viel höhere rate, dass dieses problem nicht auftreten.

Neben einer zu-langsam-verbrauchende Anwendung, gibt es andere Gründe, warum der Linux-kernel kann drop UDP-Pakete?

FWIW, dies ist auf CentOS 4, mit kernel 2.6.9-89.0.25.ELlargesmp.

Überprüfen Sie Ihre Verkabelung, bit-Fehler passiert, vor allem, wenn Sie wickeln Sie Ihre Kabel um ein eletrical Lärmquelle. Könnte ein buggy Fahrer/nic, sehen Sie, wenn Sie können, schalten Sie off/on-Prüfsummen-Verschiebung. Beachten Sie, dass Netzelemente wie switches die Pakete verwerfen. Überwachen Sie Ihren traffic mit wireshark und suchen nach "verdächtigen Dingen". Sie müssen möglicherweise isntrument Ihrer app zu überprüfen, sind Sie nicht mit übermäßigen Verzögerungen überall (z.B. das warten auf ein mutex zu lange), so dass Sie sicher, Sie Lesen schnell genug.
Die pcap-Anwendung bestätigt, dass die NIC-empfängt alle Pakete, es ist also keine Verkabelung oder switch-Problem. Als für das Programm selbst, ich bin mit dem exakt gleichen code, die gemeinsam von Dutzenden von anderen Anwendungen. Diese Verbindung ist die einzige mit dem problem.
könnte die eingehende Prüfsummen falsch sein?

InformationsquelleAutor Matt | 2011-05-06

Schreibe einen Kommentar