Ich aktualisiere derzeit ein EJB-Projekt von Version 2.0 auf Version 3.2 (alle Stateful). Die Geschäftslogik bleibt die gleiche, die einzige Sache, die sich ändert, ist der EJB-Teil (Ersetzen von Deskriptor-Dateien durch Anmerkungen, Verwenden von Injektionspunkten anstelle von traditionellen Suchen usw.). Aus der Sicht der Anfrage Verarbeitung scheint alles gut zu funktionieren, das Problem ist mit der Leistung. Bei einem angeschlossenen Client dauert jede Anfrage etwa 300 ms. Wenn ich einen zweiten Client hinzufüge, springt die durchschnittliche Zeit auf 700 ms. Bei einem dritten Client überschreitet der Durchschnitt 1 Sekunde und so weiter. Mit der EJB 2.0-Version erhöht sich die Verarbeitungszeit leicht (50 ~ 100ms), selbst bei mehr Clients, aber keine Sorge.EJB 3.2 Leistungseinbußen
Die Verschlechterung ist ziemlich offensichtlich, und ich kann einfach nicht den Grund herausfinden.
Ich habe mit EJB Timeouts, Transaktionstypen, etc. gespielt, aber ohne Glück. Ich habe auch versucht, den Server (über JMC) zu profilieren, konnte aber nichts Verdächtiges finden.
Es ist, als ob alle Anfragen nacheinander und niemals gleichzeitig bearbeitet werden.
Kann jemand Hinweise zu möglichen Ursachen geben? Gibt es irgendeine Konfiguration, die ich vermisse?
Hinweis: Das Problem tritt sowohl bei WebSphere 9 und GlassFish 4.1.1, so ist es eindeutig ein Problem der Anwendung.
EDIT # 1
Nach der Anwendung des Protokoll überprüft, kann ich bestätigen, dass die Anforderungen der Reihe nach verarbeitet werden, keine Gleichzeitigkeit.
Michaels Vorschlag folgend, sah ich ein Thread-Dump und in einem Augenblick gegeben, es gab:
- 27 RUNNABLE
- 18 TIMED_WAITING (auf Objekt-Monitor)
- 6 TIMED_WAITING (Parkplatz)
- 16 TIMED_WAITING (Schlafen)
- 23 WAITING (auf Objektmonitor)
- 40 WAITING (Parken)
Keine Anzeichen für blockierte Gewinde.
Irgendeine Idee?
Versuchen Sie, Thread-Dump während des Belastungstests mit 5+ Benutzern zu erhalten. Ich nehme an, es gibt eine gemeinsame Ressource benötigt exklusive Sperre. –
@Michael, ich habe nicht viel Erfahrung beim Analysieren von Thread Dumps. Was genau sollte ich suchen? –
Einfache Möglichkeit, Thread-Dump zu nehmen: jstack >> myapp.log. Wenn du/grep mit "lock" suchen musst. Es kann viel Müll sein. Wenn du kannst, lohnt es sich, es über Pastebin zu veröffentlichen. –