Well, I'm glad I haven't closed the bug yet; I'll look into adding a class cache to ModuleImpl.
On 12/12/05, Jeff Lubetkin (JIRA) <hivemind-dev@jakarta.apache.org> wrote: > [ > http://issues.apache.org/jira/browse/HIVEMIND-162?page=comments#action_12360245 > ] > > Jeff Lubetkin commented on HIVEMIND-162: > ---------------------------------------- > > I should note, in addition, that our application has a fairly long and > complex classpath, which could theoretically be contributing to the problem. > > > Performance bottleneck with threaded services > > --------------------------------------------- > > > > Key: HIVEMIND-162 > > URL: http://issues.apache.org/jira/browse/HIVEMIND-162 > > Project: HiveMind > > Type: Bug > > Components: framework > > Versions: 1.1 > > Environment: Linux 2.6.14.2, JBoss 4.0.3, Tomcat 5.5 > > Quad Xeon 3.2GHz, 1GB RAM > > Reporter: Jeff Lubetkin > > Attachments: hivemind-1.2-alpha-1.jar > > > > Note: This may be better classified as a Hivemind issue, but it's affecting > > Tapestry throughput so I'm putting it here. > > We've been running some perf tests using the Grinder (with 20 threads) > > generating as much load as possible on a single non-trivial page. The page > > doesn't touch many of our biz logic services, but does have some complex > > componentry to render. > > We were seeing performance ramp just fine until we reached about 200TPS, > > using only 50% CPU. No matter how many clients we threw at it, we couldn't > > get it any higher. A thread dump showed that most threads were > > bottlenecked on a synchronized method in HiveMind > > (servicemodel.ThreadedServiceModel.constructServiceForCurrentThread, see > > Stack #1 below). This was the construction of the threaded > > ClientPropertyPersistenceStrategy service. Since we don't use the client > > strategy, I did a little hivemodule.xml magic and got rid of it from the > > PersistenceStrategy configuration. This gave us a huge increase in > > throughput, up to 490TPS still using only about 50% CPU, but we still > > bottlenecked. Again, a threaddump showed the culprit as > > constructServiceForCurrentThread, this time in the storage of the > > RequestGlobals (see Stack #2). We can't remove this service, so we've hit > > a ceiling. > > Until either Tapestry changes its usage of threaded services, or Hivemind > > is changed to not synchronize in this way, this looks like a ceiling for > > Tapestry performance. It'd be nice to be able to use all of the CPU on the > > box :) > > ================== STACK #1 ================== > > [java] "http-0.0.0.0-8080-7" daemon prio=1 tid=0x6eaf62e0 nid=0x1261 > > waiting for monitor entry [0x6f69f000..0x6f6a0 > > 840] > > [java] at > > org.apache.hivemind.impl.servicemodel.ThreadedServiceModel.constructServiceForCurrentThread(ThreadedS > > erviceModel.java:166) > > [java] - waiting to lock <0x4e861d88> (a > > org.apache.hivemind.impl.servicemodel.ThreadedServiceModel) > > [java] at > > org.apache.hivemind.impl.servicemodel.ThreadedServiceModel.getServiceImplementationForCurrentThread(T > > hreadedServiceModel.java:157) > > [java] at > > $PropertyPersistenceStrategy_107fc3dfcff._service($PropertyPersistenceStrategy_107fc3dfcff.java) > > [java] at > > $PropertyPersistenceStrategy_107fc3dfcff.getStoredChanges($PropertyPersistenceStrategy_107fc3dfcff.ja > > va) > > [java] at > > $PropertyPersistenceStrategy_107fc3dfd00.getStoredChanges($PropertyPersistenceStrategy_107fc3dfd00.ja > > va) > > [java] at > > org.apache.tapestry.record.PropertyPersistenceStrategySourceImpl.getAllStoredChanges(PropertyPersiste > > nceStrategySourceImpl.java:73) > > [java] at > > $PropertyPersistenceStrategySource_107fc3dfc3c.getAllStoredChanges($PropertyPersistenceStrategySource > > _107fc3dfc3c.java) > > [java] at > > org.apache.tapestry.record.PageRecorderImpl.getChanges(PageRecorderImpl.java:68) > > [java] at > > org.apache.tapestry.record.PageRecorderImpl.rollback(PageRecorderImpl.java:73) > > [java] at > > org.apache.tapestry.engine.RequestCycle.loadPage(RequestCycle.java:277) > > [java] at > > org.apache.tapestry.engine.RequestCycle.getPage(RequestCycle.java:249) > > [java] at > > org.apache.tapestry.engine.RequestCycle.activate(RequestCycle.java:612) > > [java] at > > org.apache.tapestry.engine.PageService.service(PageService.java:66) > > [java] at > > $IEngineService_107fc3dfc4c.service($IEngineService_107fc3dfc4c.java) > > [java] at > > org.apache.tapestry.services.impl.EngineServiceOuterProxy.service(EngineServiceOuterProxy.java:65) > > [java] at > > org.apache.tapestry.engine.AbstractEngine.service(AbstractEngine.java:248) > > [java] at > > org.apache.tapestry.services.impl.InvokeEngineTerminator.service(InvokeEngineTerminator.java:60) > > [java] at > > $WebRequestServicer_107fc3dfc28.service($WebRequestServicer_107fc3dfc28.java) > > [java] at > > $WebRequestServicer_107fc3dfc24.service($WebRequestServicer_107fc3dfc24.java) > > [java] at > > org.apache.tapestry.services.impl.WebRequestServicerPipelineBridge.service(WebRequestServicerPipeline > > Bridge.java:56) > > [java] etc... > > ================== STACK #2 ================== > > [java] "http-0.0.0.0-8080-52" daemon prio=1 tid=0x89613328 nid=0x20a9 > > waiting for monitor entry [0x86d7e000..0x86d7 > > f740] > > [java] at > > org.apache.hivemind.impl.servicemodel.ThreadedServiceModel.constructServiceForCurrentThread(ThreadedS > > erviceModel.java:166) > > [java] - waiting to lock <0x9503a218> (a > > org.apache.hivemind.impl.servicemodel.ThreadedServiceModel) > > [java] at > > org.apache.hivemind.impl.servicemodel.ThreadedServiceModel.getServiceImplementationForCurrentThread(T > > hreadedServiceModel.java:157) > > [java] at > > $RequestGlobals_1080261890e._service($RequestGlobals_1080261890e.java) > > [java] at > > $RequestGlobals_1080261890e.store($RequestGlobals_1080261890e.java) > > [java] at > > $RequestGlobals_1080261890f.store($RequestGlobals_1080261890f.java) > > [java] at > > org.apache.tapestry.services.impl.WebRequestServicerPipelineBridge.service(WebRequestServicerPipeline > > Bridge.java:49) > > [java] at > > $ServletRequestServicer_108026188f4.service($ServletRequestServicer_108026188f4.java) > > [java] at > > org.apache.tapestry.request.DecodedRequestInjector.service(DecodedRequestInjector.java:55) > > [java] at > > $ServletRequestServicerFilter_108026188f0.service($ServletRequestServicerFilter_108026188f0.java) > > [java] at > > $ServletRequestServicer_108026188f6.service($ServletRequestServicer_108026188f6.java) > > [java] at > > org.apache.tapestry.multipart.MultipartDecoderFilter.service(MultipartDecoderFilter.java:52) > > [java] at > > $ServletRequestServicerFilter_108026188ee.service($ServletRequestServicerFilter_108026188ee.java) > > [java] at > > $ServletRequestServicer_108026188f6.service($ServletRequestServicer_108026188f6.java) > > [java] at > > org.apache.tapestry.services.impl.SetupRequestEncoding.service(SetupRequestEncoding.java:53) > > [java] at > > $ServletRequestServicerFilter_108026188f2.service($ServletRequestServicerFilter_108026188f2.java) > > [java] at > > $ServletRequestServicer_108026188f6.service($ServletRequestServicer_108026188f6.java) > > [java] at > > $ServletRequestServicer_108026188e8.service($ServletRequestServicer_108026188e8.java) > > [java] at > > org.apache.tapestry.ApplicationServlet.doService(ApplicationServlet.java:123) > > [java] at > > com.zillow.web.ZillowServlet.doService(ZillowServlet.java:35) > > [java] at > > org.apache.tapestry.ApplicationServlet.doGet(ApplicationServlet.java:79) > > [java] at > > javax.servlet.http.HttpServlet.service(HttpServlet.java:697) > > [java] at > > javax.servlet.http.HttpServlet.service(HttpServlet.java:810) > > [java] at > > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) > > [java] etc... > > -- > This message is automatically generated by JIRA. > - > If you think it was sent incorrectly contact one of the administrators: > http://issues.apache.org/jira/secure/Administrators.jspa > - > For more information on JIRA, see: > http://www.atlassian.com/software/jira > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > -- Howard M. Lewis Ship Independent J2EE / Open-Source Java Consultant Creator, Jakarta Tapestry Creator, Jakarta HiveMind Professional Tapestry training, mentoring, support and project work. http://howardlewisship.com --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]