Ich muss einen UDP-Server bauen, der ~ 10_000 Anfragen / Sek. verarbeiten kann. Begann mit dem folgenden Code, um zu testen, ob ein Java-Socket mit dieser Anzahl von Anfragen umgehen kann.
Ich bombardiere den Server für eine Minute mit ~ 9000 Anfragen,
%Vor%und im TCP-Dump sehe ich
%Vor%UDP-Servercode:
%Vor%Was ist der wahrscheinliche Grund, warum der Kernel die Pakete im Programm fallen lässt? so einfach?
Wie man es verringert? Irgendeine andere Implementierung?
Von diesem Link lesen Sie von der Kommentare, Verlust von Paketen für UDP-Protokoll kann immer auch zwischen dem Netzwerk zu Java-Socket.recieve-Methode passieren.
Hinweis: Über Anomalien in den erfassten tcpdump-Paketen muss etwas herausgefunden werden, aber es gibt eine ganze Reihe von Paketen, die fallen gelassen wurden.
Die Anomalien im tcpdump sind fehlender Pufferraum , Um die Anzahl der empfangenen Pakete zu kennen, benutze ich die iptraf-ng , die die gibt Anzahl der pro Port empfangenen Pakete:)
Mutli-threading
Ihr Code-Beispiel tut nichts, nachdem ein Paket empfangen wurde. Wenn das der Fall ist, kann Multithreading Ihnen nicht helfen.
Wenn dies jedoch nur zum Testen ist und Ihre tatsächliche Anwendung etwas mit dem empfangenen Paket tun muss, müssen Sie das Paket auf ein anderes Thread
(oder einen Pool von ihnen) schieben und sofort wieder auf das nächste Paket warten .
Grundsätzlich müssen Sie die Zeit zwischen zwei Aufrufen von socket.receive()
minimieren.
Hinweis: Dies ist nicht das einzige Modell mit mehreren Threads, das für diesen Fall verfügbar ist.
Puffergröße
Erhöhen Sie die Puffergröße mit socket.setReceiveBufferSize
, die dem SO_RCVBUF zugeordnet ist:
Durch die Erhöhung von SO_RCVBUF kann die Netzwerkimplementierung mehrere Pakete puffern, wenn Pakete schneller ankommen als empfangen (DatagramPacket).
Dies ist jedoch nur ein Hinweis :
Die Option SO_RCVBUF wird von der Netzwerkimplementierung als Hinweis verwendet, um die zugrunde liegenden Netzwerk-E / A-Puffer zu dimensionieren.
Sie können auch, wenn Ihre Einrichtung dies zulässt, direkt zum Betriebssystem gehen und die Größe des Puffers ändern.
Irrelevant
Hinweis: Lesen Sie dies nur, wenn Sie nicht sicher sind, dass die Paketgröße weniger als 1024 Byte beträgt.
Ihre Paketpuffergröße scheint für generische Pakete zu niedrig zu sein, was zu Fehlern führen kann, weil: Wenn ein Paket größer als Ihr Puffer ist, wird es keinen Fehler geben, es ignoriert nur die überlaufenden Bytes.
BEARBEITEN:
Anderes Multi-Threading-Modell
Hinweis: Dies ist eine Idee, ich weiß nicht, ob es tatsächlich funktioniert.
3 Themen:
Init:
While-Schleife des B1:
Gleiches gilt für B2.
Dies ist das Thread-Diagramm (Zeile, in der das Paket empfangen wurde):
%Vor%Die tatsächliche Anzahl der Pakete, die verarbeitet werden können, hängt von der CPU Ihres Ziel- und Zielservers, der Netzwerkverbindung zwischen ihnen und Ihrem tatsächlichen Programm ab. Wenn Sie eine leistungsstarke Lösung für die Vernetzung in Java benötigen, können Sie Korallenreaktor verwenden: Ссылка
Ein Nachteil von UDP ist, dass es nicht die zuverlässigen Liefergarantien von TCP bietet Die Konfigurationsattribute mcast_recv_buf_size und ucast_recv_buf_size des UDP-Protokolls werden verwendet, um die Menge des Empfangspuffers anzugeben.
Es hängt von dem Betriebssystem ab, mit dem Sie Ihr Programm ausführen. Puffergröße für verschiedene Betriebssysteme sind:
Daher hängt die UDP-Lastbehandlung sowohl von der Maschinen- als auch von der Betriebssystemkonfiguration ab.
Tags und Links java sockets network-programming udp