2013-02-21 8 views
8

Ich habe Micro-optimizing unsere Seite Antwortzeit auf Tomcat und in fast allen Fällen sehe ich eine Reaktionszeit von 50ms wenn ich immer und immer wieder auffrischen, aber wenn die Seite nicht für eine Sekunde geschlagen wird oder zwei springt die Reaktionszeit zurück auf 500ms.Tomcat sporadische Latenz

Ich habe dieses gleiche Verhalten unabhängig von lokalen, nicht lokalen, APR, NIO, JIO, statischen oder dynamischen Antworten gesehen (dh Serving statische Datei oder Übergabe der Antwort dynamisch). Bisher habe ich dieses Verhalten noch nicht gesehen nicht geschehen auf Tomcat (das ist konsistent unter 400ms unabhängig von der Frequenz).

Ich habe Visual VM auch verwendet, um zu sehen, ob es irgendwelche Hinweise gab.

Ich dachte, es wäre eine Art Keep alive, aber wenn ich Apache Bench laufen lasse, bekomme ich sogar noch schnellere Antwortzeiten (unter 50ms) (offensichtlich, weil es häufig darauf trifft).

Also wie halten Sie eine geringe Latenz nicht häufig URL in Tomcat drücken? Vielleicht ist diese Frage besser für ServerFault?

UPDATE: Ich bin fast positiv, es ist ein Tomcat 6 Problem. Ich dachte, ich hätte auf Tomcat 7 getestet, aber ich habe es erneut getestet und hatte kein Problem (siehe Ergebnisse unten). Selbst das neueste Tomcat 6 hat dieses Problem immer noch. Hier

ist die ab Ausgang für Tomcat 6 (der max bemerken):

Connection Times (ms) 
       min mean[+/-sd] median max 
Connect:  0 0 0.0  0  0 
Processing: 14 39 45.2  30  314 
Waiting:  14 38 45.2  30  314 
Total:   14 39 45.2  30  314 

Hier ab Ausgang für Tomcat 7 Bekanntmachung der max:

Connection Times (ms) 
       min mean[+/-sd] median max 
Connect:  0 0 0.0  0  0 
Processing: 25 38 8.8  37  67 
Waiting:  25 37 8.7  36  66 
Total:   25 38 8.8  37  67 

Die Tomcat Versionen sind der einzige Unterschied (gleiche Maschine, gleiche JDK, etc ...). Ich war mir sicher, dass das neueste Tomcat 6 in Ordnung sein würde, aber es hat ähnliche Latenz auf erste Anfrage.

+0

Es hängt wirklich davon ab, was Ihre Anfrage tut, würde ich denken. Nehmen Sie nur eine HTML-Datei oder initialisieren Sie eine Art von Datendienst, ect. – aglassman

+0

Verwenden Sie openjdk? Ich hatte ein paar seltsame Probleme damit, als ich zu Oracle JDK wechselte. – Jaydee

+0

Vielleicht gibt es eine Art von Full-GC 'Stoppt die Welt' ... Hast du die Garbage-Collector-Ausgabe (verbose GC) überprüft? – home

Antwort

1

Ich schaute auf den Tomcat-Code Ich beschloss, auf das Wort "Weak" auf die Theorie zu suchen, dass Ihr Problem ist, dass etwas in einer schwachen Referenz gesammelt wird, wenn Sie nicht schnell erneut anfordern.

ich mit folgenden Vermutung kam ... Ich fand diese interessante Klasse:

http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/javax/el/BeanELResolver.java?revision=1027187&view=markup

Es scheint, einen Cache von BeanProperties Objekten zu erhalten, wobei ein Teil davon durch eine WeakHashMap gehandhabt wird, und Immer wenn der Cache voll ist, wird alles in eine WeakHashMap gestellt und es kann Müll gesammelt werden. Wenn Elemente in der schwachen Karte angefordert werden, werden sie in die Hauptkarte zurückgelegt (die nicht schwach ist). Wenn Ihre Seite dieses Verhalten direkt am Ende Ihrer Verarbeitung auslöst (indem Sie etwa die Größe des Cache in BeanProperties hinzufügen, können Sie fast alle zwischengespeicherten Beanbeschreibungen wegwerfen.

Günstigerweise gibt es eine diese Eigenschaft für Tuning:

private static final String CACHE_SIZE_PROP = 
    "org.apache.el.BeanELResolver.CACHE_SIZE"; 

So versuchen, vielleicht mit, dass zu spielen und sehen, ob sie das Verhalten beeinflusst diese es aber nicht sein könnte, da ich nicht eine große Veränderung (Quick Look) in dieser Klasse in Tomcat gesehen habe? 7 wo du sagst, dass dein Problem verschwindet.(Haben Sie diese Eigenschaft in Ihren vorherigen Tuning-Bemühungen optimiert?)