2009-06-06 8 views
11

Wir betreiben Tomcat-Anwendungsserver, die über 100 gleichzeitige Sitzungen verarbeiten. In den letzten 2 Monaten haben die aktivsten Benutzer festgestellt, dass sie manchmal vom System abgemeldet werden.Tomcat-Sitzungen, die unerwartet ablaufen

Wie ich aus dem Log tomcat Sitzungen gelernt wurden abgelaufen ohne Grund.

Ich sehe keine Probleme von der Web-Anwendung Seite. Gibt es ein Problem von der Tomcat-Seite?

Tomcat 6.0.18.

+2

Was haben Sie als Ursache gefunden? –

Antwort

8

Wenn es keinen Code Chance auslösenden dies gewesen ist, würde ich sehen Speichernutzung. Diese könnte der Effekt von Tomcat nicht genügend Arbeitsspeicher und Invalidierung Sitzungen zur Wiederherstellung sein.

Wenn möglich, Garbage-Sammlungen zu überwachen, und/oder Überwachung mit jconsole oder jvisvismvm.

2

ein Timeout ist, dass Sie in Ihrem web.xml konfigurieren:

<web-app> 
    ... 
    <session-config> 
    <session-timeout>-1</session-timeout> 
    </session-config> 
</web-app> 

Verwendung -1 ohne Timeout

+1

Das Problem ist nicht da. Das aktuelle Zeitlimit ist auf eine Stunde eingestellt. Aber die Benutzer werden getreten, während sie die Anwendung aktiv benutzen. –

-1

Obwohl ich die Ursache des Problems nicht kenne, wäre eine mögliche Lösung (die ich bei meinem vorherigen Projekt getan hatte), die Anwendung auf einem Tomcat-Cluster auszuführen und Session Failover zu haben. Sitzungen können standardmäßig sticky sein, und wenn ein Knoten ausfällt, übernehmen die gesunden Knoten die Sitzungen und all dies ist für den Endbenutzer transparent.

+3

Es scheint, als ob Clustering Probleme mit Sitzungen verursacht, als sie zu beheben. – erickson

2

Steigern Sie die Protokollierung von Sitzungen, was möglicherweise ein Licht auf Ihr Problem wirft.

Die Tomcat-Konfigurationsseite Logging in Tomcat enthält ein Beispiel für die zunehmende Protokollierung von Sitzungen.

0

Sie können die Fehlerdatenbank von Tomcat durchsuchen, aber es wäre besser, zuerst einen Blick auf Ihre Webanwendung zu werfen. Die Wahrscheinlichkeit, dass etwas mit Tomcat nicht stimmt, ist sehr gering.

Versuchen Sie herauszufinden, was die Ungültigkeit der Sitzung verursacht. Benutzt du Filter? Haben Sie kontextübergreifende Anfragen? Fügen Sie für jede Anfrage Protokollinformationen hinzu, um herauszufinden, wann genau die Sitzung verloren gegangen ist.

4

Ich würde die Überwachung des Servers im Allgemeinen und die Sitzungen speziell erhöhen.

Eine gute Überwachungsanwendung ist lambda probe - es ermöglicht Ihnen, die aktuellen Sitzungen und ihre Daten anzuzeigen. Ich würde auch eine HttpSessionListener hinzufügen, um Sitzungserstellung und -zerstörung zu protokollieren.

bearbeiten

Ist ist möglich, dass Sie einige nicht serializble Objekte zur Sitzung hinzufügen und Tomcat nicht sie auf die Festplatte zu passivieren?

Edit 2

Lambda-Sonde scheint tot zu sein, und es eine viel bessere Gabel des Projekts über bei http://code.google.com/p/psi-probe/

7

Eine mögliche Ursache ist, dass Sie in der Sitzung ein Objekt setzen, das nicht Implementieren Sie die Serializable-Schnittstelle. Tomcat schreibt gelegentlich einige der Sitzungen auf die Festplatte. Wenn eine Sitzung nicht serialisierbare Objekte enthält, wird sie einfach aus dem Container entfernt (wegen NotSerializableException). Wenn dies der Fall ist, sollten Sie die Ausnahme in der Tomcat-Protokolldatei sehen.

+0

In welchen Fällen schreibt tomcat Sessions auf Festplatte? in einer Cluster-basierten Umgebung oder wenn der Arbeitsspeicher knapp wird? –

2

Wir liefen gerade in diese mit tomcat 6_0_18 und ibm 1,5 Jvm

stellt sich heraus, es ein ibm Jvm Problem mit atomaren Operationen war.

Es gibt eine Lösung in Tomcats größer als 6_0_19, um damit umzugehen.

Es ist auch nicht in 1.5 Sonne Jvm tritt

hier sind einige weitere Details

tomcat bugzilla case

2

ich ähnliche Probleme gesehen haben, wenn folgende Voraussetzungen vorliegen:

  • mehrere Instanzen der Tomcat-App werden über mehrere JVMs installiert
  • laden ba Lancierung (zwischen dem Webserver und den Tomcat JVMs) ist nicht korrekt konfiguriert.
  • Tomcat-Session Replikationsfunktion ist nicht
  • aktiviert

Aufgrund der fehlerhaften Last Config balancieren, kann der Web-Server zufällig entscheiden Sitzungsaffinität zu brechen und eine eingehende Anforderung an einen Tomcat JVM senden, die noch nie gesehen hat die Sitzung vorher. Die Tomcat JVM gibt eine neue Sitzung aus, und der Benutzer verliert alle vorherigen Sitzungsdaten und beginnt neu.

+0

Können Sie genauer angeben, wie der Lastenausgleich nicht korrekt konfiguriert ist? – fool4jesus