Wir haben einen Java-Server, der unter Linux an einem bestimmten Port ausgeführt wird und dauerhafte Verbindungen für Tausende und Abertausende von Benutzern akzeptiert. In letzter Zeit können unsere Kunden keine Verbindung mit einem Timeout-Fehler herstellen. Wir vermuten, dass der Datenverkehr zu hoch wird, aber unser Java-Protokoll zeigt tatsächlich, dass nicht viele pro Sekunde verbunden sind.
Wir vermuten, dass es sein könnte, dass zu viele gleichzeitig versuchen und sie im Grunde genommen auf Betriebssystemebene gelöscht werden und daher das Java-Programm nie wirklich die Chance bekommt, die Verbindung zu akzeptieren? Gibt es eine Art von Linux-Protokoll, das zeigt, dass jemand versucht, einen Socket zu treffen?
iptables -I INPUT -p tcp --dport some_port -m state --state NEW
. Beachten Sie, dass Sie-j LOG
die Systemprotokolldatei nicht mit vielen nicht benötigten Daten überfluten, wenn Sie die Details der einzelnen Verbindungsversuche nicht berücksichtigen.Wenn ich wirklich böse Netzwerkprobleme habe, neige ich dazu, Wireshark zu starten . Für mich gibt es kein besseres Netzwerkdiagnosetool, wenn ich mich auf die kleinsten Details konzentrieren muss. Machen Sie sich keine Sorgen, wenn Sie es weder auf der Quell- noch auf der Ziel-Box installieren können. Sie können ausführen
tcpdump -w
, um Paketdaten auf Start- und / oder Endpunkt in eine Datei zu schreiben und die Datei nach Belieben auf einer anderen Box an Wireshark weiterzuleiten.quelle
tcpdump -nS dst port <some port>
Wäre gut, um genau zu sehen, was Ihre Java-Threads auf Socket-Ebene bekommen. Gleichzeitig möchten Sie dies mit den Netzwerkinformationen des Betriebssystems korrelieren. Schauen Sie sich AppFirst an. Sie können so etwas tun.
quelle
Zeigt die aktuell eingerichteten Verbindungen an.
Vergleichen Sie dies mit Ihren aktiven
ulimit
Einstellungen und natürlich mit der maximalen Anzahl von Verbindungen, die Ihre Java-App verarbeiten kann.quelle