Hallo,
beim Prüfen einer Java-Anwendung im Produktionsumfeld ist es zu massiven Performanceproblemen gekommen. Dazu folgende Stats:
-Java-Anwendung mit TCP/IP-Kommunikation als Server, dazu gibt es noch eine C-Komponente für intensive Rechenaufgaben. Diese Anwendung nimmt über einen Port Nachrichten entgegen und soll diese beantworten. Für das Verschicken ist ein Transaktionssystem (TrxSys) verantwortlich, das ist in C geschrieben.
TrxSys hat jedoch schon massive Probleme nur Verbindungen aufzubauen (also ohne Transaktionen zu verschicken), daher musste das Timeout für einen Verbindungsaufbau hochgeschraubt werden, was in Produktion nicht zulässig ist.
Zum Verbindungsaufbau schickt TrxSys eine 51Byte große Nachricht an den Java-Server, dieser wiederum antwortet zunächst mit der identischen Nachricht.
Aufgefallen ist u.a., dass der Java-Server die Antwort auf 2 Pakete aufteilt, das erste ist nur 2 Byte groß, das zweite dann 48. TrxSys muss das dann zusammensetzen und das dauert wohl. Außerdem vergeht zwischen beiden gesendeten Paketen mindesten 150ms, was an sich schon viel zu lange ist.
Weiterhin:
Es gibt einen auch TrxSys-Simulator in Java, der schickt ebenfalls Nachrichten und wartet auf Antworten. Bringt man beide Java-Anwendungen über Netzwerk (2 Rechner) zusammen, dann schaffe ich 3Trx pro Sekunde. Macht man das Ganze über localhost/die ip-adresse eines Rechers, habe ich hingegen 600Trx/sek. Bei letzter Variante wird die Netzwerkkarte wohl außen vor gelassen, es ist kein Traffic darüber zu erkennen. Offenbar werden die Nachrichten auf einer anderen Schicht ausgetauscht.
Ersetzt man Sender (Simulator) oder Empfänger (Server) durch ein C-Programm geht die Performance nach oben. Aber die von Java geschickte Nachricht wird jeweils in 2 Pakete aufgeteilt. Sind beide Komponenten in C geht es rasend schnell und es gibt jeweile nur ein Paket pro Nachricht.
Kann jemand damit etwas anfangen?
beim Prüfen einer Java-Anwendung im Produktionsumfeld ist es zu massiven Performanceproblemen gekommen. Dazu folgende Stats:
-Java-Anwendung mit TCP/IP-Kommunikation als Server, dazu gibt es noch eine C-Komponente für intensive Rechenaufgaben. Diese Anwendung nimmt über einen Port Nachrichten entgegen und soll diese beantworten. Für das Verschicken ist ein Transaktionssystem (TrxSys) verantwortlich, das ist in C geschrieben.
TrxSys hat jedoch schon massive Probleme nur Verbindungen aufzubauen (also ohne Transaktionen zu verschicken), daher musste das Timeout für einen Verbindungsaufbau hochgeschraubt werden, was in Produktion nicht zulässig ist.
Zum Verbindungsaufbau schickt TrxSys eine 51Byte große Nachricht an den Java-Server, dieser wiederum antwortet zunächst mit der identischen Nachricht.
Aufgefallen ist u.a., dass der Java-Server die Antwort auf 2 Pakete aufteilt, das erste ist nur 2 Byte groß, das zweite dann 48. TrxSys muss das dann zusammensetzen und das dauert wohl. Außerdem vergeht zwischen beiden gesendeten Paketen mindesten 150ms, was an sich schon viel zu lange ist.
Weiterhin:
Es gibt einen auch TrxSys-Simulator in Java, der schickt ebenfalls Nachrichten und wartet auf Antworten. Bringt man beide Java-Anwendungen über Netzwerk (2 Rechner) zusammen, dann schaffe ich 3Trx pro Sekunde. Macht man das Ganze über localhost/die ip-adresse eines Rechers, habe ich hingegen 600Trx/sek. Bei letzter Variante wird die Netzwerkkarte wohl außen vor gelassen, es ist kein Traffic darüber zu erkennen. Offenbar werden die Nachrichten auf einer anderen Schicht ausgetauscht.
Ersetzt man Sender (Simulator) oder Empfänger (Server) durch ein C-Programm geht die Performance nach oben. Aber die von Java geschickte Nachricht wird jeweils in 2 Pakete aufgeteilt. Sind beide Komponenten in C geht es rasend schnell und es gibt jeweile nur ein Paket pro Nachricht.
Kann jemand damit etwas anfangen?