Anwendung(sserver) nach wenigen Tagen langsam

fanste

Erfahrenes Mitglied
Hallo,

ich habe seit einiger Zeit ein großes Problem mit unserem Anwendungsserver JBoss 7 bzw den Anwendung, die darauf laufen. Der Server beheimatet ca. 10 JavaEE 6 Anwendungen, hat 1,5 GB Heap, 512MB Perm und 4 CPUs zur Verfügung und läuft unter Java 7u60 x64 (JDK).

Soweit mal das drumrum. Das Problem ist nun folgendes:
Der Server wird Samstag Nacht gegen 2 Uhr neu gestartet. Nach maximal 5-6 Tagen ist er aber so langsam, dass das erstellen einer Session bis zu 10 Sekunden beträgt. Hat er die Session, so laden die Seiten dann doch wieder recht zügig. Der Worst-Case waren 30 Sekunden. Zusätzlich passiert es hin und wieder, dass eine Anfrage an den Server beim "Senden" hängen bleibt, obwohl der Browser meint, dass die Seite fertig geladen hat. Mal sind es nur 2-3 Minuten, können aber auch Tage sein.
Während der Problematik mit der Session geht die CPU dann auch promt auf 25% hoch, bis die Session erstellt ist (also exakt 1 Core unter Volllast). Die hängenden Anfragen verursachen auch Last, nicht immer, aber es kommt vor.

Bisher ist mir nichts besseres eingefallen als mit dem Tool VisualVM auf den Server zu gehen (das sind dann gleich nochmal 25% mehr CPU, wenn der Server bereits "spinnt") und mit Thread-Dumps anzufertigen. Hierbei ist mir aufgefallen, dass in den relevanten Threads grundsätzlich eine Methode aktiv war, die sich auf die Reflection-API bezieht. Während der Erstellung der Session ist dies immer in einer Bibliothek namens Waffle, welche von uns für SSO (Single-Sign-On) über NTLMv2 genutzt wird.

Hier mal ein paar Beispiele für solche Stacktraces:
Code:
"http-/0.0.0.0:8080-19" - Thread t@164
   java.lang.Thread.State: RUNNABLE
    at sun.reflect.ReflectionFactory.langReflectAccess(ReflectionFactory.java:409)
    at sun.reflect.ReflectionFactory.copyField(ReflectionFactory.java:307)
    at java.lang.Class.copyFields(Class.java:2882)
    at java.lang.Class.getFields(Class.java:1415)
    at com.sun.jna.Native.loadLibraryInstance(Native.java:411)
    at com.sun.jna.Native.getTypeMapper(Native.java:492)
    - locked <502c0606> (a java.util.WeakHashMap)
    at com.sun.jna.Structure.setTypeMapper(Structure.java:195)
    at com.sun.jna.Structure.<init>(Structure.java:172)
    at com.sun.jna.Structure.<init>(Structure.java:167)
    at com.sun.jna.Structure.<init>(Structure.java:163)
    at com.sun.jna.Structure.<init>(Structure.java:154)
    at com.sun.jna.platform.win32.WinNT$SID_AND_ATTRIBUTES.<init>(WinNT.java:249)
    at sun.reflect.GeneratedConstructorAccessor180.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at java.lang.Class.newInstance(Class.java:374)
    at com.sun.jna.Structure.newInstance(Structure.java:1183)
    at com.sun.jna.Structure.toArray(Structure.java:1054)
    at com.sun.jna.Structure.toArray(Structure.java:1074)
    at com.sun.jna.platform.win32.WinNT$TOKEN_GROUPS.getGroups(WinNT.java:409)
    at com.sun.jna.platform.win32.Advapi32Util.getTokenGroups(Advapi32Util.java:333)
    at waffle.windows.auth.impl.WindowsIdentityImpl.getUserGroups(Unknown Source)
    at waffle.windows.auth.impl.WindowsIdentityImpl.getGroups(Unknown Source)
    at waffle.servlet.WindowsPrincipal.<init>(Unknown Source)
    at waffle.servlet.NegotiateSecurityFilter.doFilter(Unknown Source)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
    at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50)
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:165)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:567)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:372)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:679)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:931)
    at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
    - None
Code:
"http-/0.0.0.0:8080-19" - Thread t@164
   java.lang.Thread.State: RUNNABLE
    at java.lang.reflect.Field.<init>(Field.java:118)
    at java.lang.reflect.Field.copy(Field.java:141)
    at java.lang.reflect.ReflectAccess.copyField(ReflectAccess.java:140)
    at sun.reflect.ReflectionFactory.copyField(ReflectionFactory.java:307)
    at java.lang.Class.copyFields(Class.java:2882)
    at java.lang.Class.getFields(Class.java:1415)
    at com.sun.jna.Native.loadLibraryInstance(Native.java:411)
    at com.sun.jna.Native.getLibraryOptions(Native.java:465)
    - locked <502c0606> (a java.util.WeakHashMap)
    at com.sun.jna.Native.getStructureAlignment(Native.java:536)
    - locked <502c0606> (a java.util.WeakHashMap)
    at com.sun.jna.Structure.setAlignType(Structure.java:213)
    at com.sun.jna.Structure.<init>(Structure.java:171)
    at com.sun.jna.Structure.<init>(Structure.java:167)
    at com.sun.jna.Structure.<init>(Structure.java:163)
    at com.sun.jna.Structure.<init>(Structure.java:154)
    at com.sun.jna.platform.win32.WinNT$SID_AND_ATTRIBUTES.<init>(WinNT.java:249)
    at sun.reflect.GeneratedConstructorAccessor180.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at java.lang.Class.newInstance(Class.java:374)
    at com.sun.jna.Structure.newInstance(Structure.java:1183)
    at com.sun.jna.Structure.toArray(Structure.java:1054)
    at com.sun.jna.Structure.toArray(Structure.java:1074)
    at com.sun.jna.platform.win32.WinNT$TOKEN_GROUPS.getGroups(WinNT.java:409)
    at com.sun.jna.platform.win32.Advapi32Util.getTokenGroups(Advapi32Util.java:333)
    at waffle.windows.auth.impl.WindowsIdentityImpl.getUserGroups(Unknown Source)
    at waffle.windows.auth.impl.WindowsIdentityImpl.getGroups(Unknown Source)
    at waffle.servlet.WindowsPrincipal.<init>(Unknown Source)
    at waffle.servlet.NegotiateSecurityFilter.doFilter(Unknown Source)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
    at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50)
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:165)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:567)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:372)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:679)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:931)
    at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
    - None
Code:
"http-/0.0.0.0:8080-11" - Thread t@128
   java.lang.Thread.State: RUNNABLE
    at java.lang.reflect.Method.getName(Method.java:173)
    at java.lang.Class.searchMethods(Class.java:2792)
    at java.lang.Class.getDeclaredMethod(Class.java:2002)
    at pkg.app.lists.OffersBean$Proxy$_$$_WeldSubclass.isTaskSelected(OffersBean$Proxy$_$$_WeldSubclass.java)
    at pkg.app.lists.OffersBean$Proxy$_$$_WeldClientProxy.isTaskSelected(OffersBean$Proxy$_$$_WeldClientProxy.java)
    at sun.reflect.GeneratedMethodAccessor795.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at javax.el.BeanELResolver.getValue(BeanELResolver.java:302)
    at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
    at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
    at org.apache.el.parser.AstValue.getValue(AstValue.java:169)
    at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
    at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
    at javax.faces.component.UIComponentBase.isRendered(UIComponentBase.java:419)
    at org.primefaces.component.api.UIData.processChildren(UIData.java:302)
    at org.primefaces.component.api.UIData.processPhase(UIData.java:267)
    at org.primefaces.component.api.UIData.processDecodes(UIData.java:231)
    at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:504)
    at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:183)
    at org.primefaces.component.api.UIData.visitTree(UIData.java:675)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623)
    at javax.faces.component.UIForm.visitTree(UIForm.java:371)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623)
    at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:378)
    at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:253)
    at org.primefaces.context.PrimePartialViewContext.processPartial(PrimePartialViewContext.java:57)
    at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:923)
    at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
    at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:98)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
    at com.luk.emea.webapp.servlet.filter.LoggingFilter.doFilter(LoggingFilter.java:69)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
    at com.luk.emea.webapp.servlet.filter.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:51)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
    at org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
    at waffle.servlet.NegotiateSecurityFilter.doFilterPrincipal(Unknown Source)
    at waffle.servlet.NegotiateSecurityFilter.doFilter(Unknown Source)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
    at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50)
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:165)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:567)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:372)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:679)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:931)
    at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
    - None

Das war in allen 20 Thread-Dumps der Fall, die ich genommen habe. Ähnlich wie Session erstellen #2 gibt es noch ein Beispiel, wo 2 andere Threads auf die Freigabe der WeakHashmap in com.sun.jna.Native.getStructureAlignment warten.

Habt Ihr eine Idee, wie es zu diesem Problem kommen kann, was dafür die Ursache ist? Ist das mit der Reflection API nur dummer Zufall und ich muss das Problem ganz wo anders suchen?
Ich bin absolut ratlos und hoffe auf einen rettenden Hinweis.

Danke euch schonmal und eine guten Wochenstart.
 

Fasibio

Mitglied
Das ist evt. die Falsche Forums Kategorie.
Es dreht sich ja weniger um die programmierung als mehr um die administriung.
Ich würde dir empfehlen mal snmp zu installieren und die werte mitzuprotokollieren. und zu schauen wie sich das System "aufschaukelt".
Vielleicht werden objecte nicht ordungsgemäß aufgeräumt weil sie alles Static sind etc... das kann es viele gründe geben....
 

fanste

Erfahrenes Mitglied
Vielleicht kann ein Mod das Thema entsprechend verschieben, wenn es eine bessere Kategorie gibt.

In "SNMP" werde ich mich einmal einlesen, danke.
Am Heap direkt wird es nicht liegen. Laut VisualVM sind immer mindestens 500MB frei und nach einem manuell gestarteten GC sind es über 1GB. Die schlechte Performance bleibt allerdings.