[jboss-dev-forums] [Design of JBoss/Tomcat Integration] - Tomcat performance bottleneck

michael.yuan@jboss.com do-not-reply at jboss.com
Mon Jul 24 19:52:57 EDT 2006


Hi guys,

This is not really a jboss/tomcat integration issue. But I cannot find a better forum to discuss it ... So, here it goes:

In my performance tests at Dell, I identified a likely performance contention point in Tomcat. The symptom is that we cannot drive the server CPU utilization beyond 90 percent. A quick thread dump shows that most threads are waiting to execute a synchronized HashMap access block in line 175 of the org.apache.catalina.core.ApplicationContext class:


  | public class ApplicationContext
  |     implements ServletContext {
  | 
  |     ... ...
  | 
  |     public Object getAttribute(String name) {
  | 
  |         synchronized (attributes) {
  |             return (attributes.get(name));
  |         }
  | 
  |     }
  | }
  | 

Since the server has multiple CPUs, they must wait in turn to run this block of code and hence results in lower CPU utilization. The best solution is to use a concurrent hashmap to get rid of the synchronized block. Can we get this fixed? Thanks. I attach a more detailed stack trace from the thread dump below.


  | "http-0.0.0.0-8080-17" daemon prio=1 tid=0x0000002c918799d0 
  | nid=0x107b waiting for monitor entry 
  | [0x0000000044c9a000..0x0000000044c9bc90]
  |         at org.apache.catalina.core.ApplicationContext.getAttribute(ApplicationContext.java:175)
  |         - waiting to lock <0x0000002ae2a4f980> (a java.util.HashMap)
  |         at org.apache.catalina.core.ApplicationContextFacade.getAttribute(ApplicationContextFacade.java:315)
  |         at org.apache.myfaces.context.servlet.ApplicationMap.getAttribute(ApplicationMap.java:41)
  |         at org.apache.myfaces.context.servlet.AbstractAttributeMap.get(AbstractAttributeMap.java:87)
  |         at org.jboss.seam.contexts.FacesApplicationContext.get(FacesApplicationContext.java:46)
  |         at org.jboss.seam.Component.forName(Component.java:1138)
  |         at org.jboss.seam.ejb.SeamInterceptor.getSeamComponent(SeamInterceptor.java:93)
  |         at org.jboss.seam.ejb.SeamInterceptor.aroundInvokeInContexts(SeamInterceptor.java:66)
  |         at org.jboss.seam.ejb.SeamInterceptor.aroundInvoke(SeamInterceptor.java:45)
  |         at sun.reflect.GeneratedMethodAccessor85.invoke(Unknown Source)
  |         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  |         at java.lang.reflect.Method.invoke(Method.java:585)
  |         at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:118)
  |         at org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63)
  |         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  |         at org.jboss.ejb3.entity.ExtendedPersistenceContextPropagationInterceptor.invoke(ExtendedPersistenceContextPropagationInterceptor.java:57)
  |         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  |         at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54)
  |         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  |         at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47)
  |         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  |         at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:79)
  |         at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:197)
  |         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  |         at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
  |         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  |         at org.jboss.ejb3.stateful.StatefulInstanceInterceptor.invoke(StatefulInstanceInterceptor.java:81)
  |         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  |         at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77)
  |         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  |         at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:47)
  |         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  |         at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
  |         at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  |         at org.jboss.ejb3.stateful.StatefulContainer.localInvoke(StatefulContainer.java:180)
  |         at org.jboss.ejb3.stateful.StatefulLocalProxy.invoke(StatefulLocalProxy.java:98)
  |         at $Proxy72.getCart(Unknown Source)
  | 

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3960546#3960546

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3960546



More information about the jboss-dev-forums mailing list