[Building Sakai] Load test of Sakai

Daniel Lind Daniel.Lind at umdac.umu.se
Thu Aug 20 02:24:37 PDT 2009


We have these settings In JMeter:

"Think time": 30s (deviation 10s)
"Ramp up": 5 minutes

All users are unique in Sakai.

The limits are actually a bit diffuse. Disk IO is very low, CPU is high for the tomcat, but not for MySQL. Memory usage is not too high. This is from Sakai:
** Memory report
freeMemory: 526589992 totalMemory: 1594077184 maxMemory: 2147352576

The load on the machine is approximately  around 7 at most. What happens is that, when too many test users are taking the test, Sakai throws many exception like the one below:

org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException: Batch update returned unexpected row count from update [4]; actual row count: 0; expected: 1; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [4]; actual row count: 0; expected: 1
Caused by: org.hibernate.StaleStateException: Batch update returned unexpected row count from update [4]; actual row count: 0; expected: 1
        at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:61)
        at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:46)
        at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:68)
        at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
        at org.hibernate.jdbc.BatchingBatcher.addToBatch(BatchingBatcher.java:34)
        at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2403)
        at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2307)
        at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2607)
        at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:92)
        at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:234)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:142)
        at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
        at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
        at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
        at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:575)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:662)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:632)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:314)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:117)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:166)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
        at $Proxy61.saveOrUpdateAssessmentGrading(Unknown Source)
        at org.sakaiproject.tool.assessment.services.GradingService.saveOrUpdateAssessmentGrading(GradingService.java:486)
        at org.sakaiproject.tool.assessment.ui.bean.delivery.DeliveryBean.syncTimeElapsedWithServer(DeliveryBean.java:2312)
        at org.sakaiproject.tool.assessment.ui.listener.delivery.UpdateTimerFromTOCListener.processAction(UpdateTimerFromTOCListener.java:62)
        at javax.faces.event.ActionEvent.processListener(ActionEvent.java:57)
        at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:649)
        at javax.faces.component.UICommand.broadcast(UICommand.java:297)
        at javax.faces.component.UIData.broadcast(UIData.java:657)
        at javax.faces.component.UIData.broadcast(UIData.java:657)
        at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:267)
        at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:307)
        at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:79)
        at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
        at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:90)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:197)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
        at com.corejsf.UploadFilter.doFilter(UploadFilter.java:118)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
        at org.sakaiproject.util.RequestFilter.doFilter(RequestFilter.java:555)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
        at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:691)
        at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:469)
        at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:403)
        at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
        at org.sakaiproject.jsf.util.SamigoJsfTool.dispatch(SamigoJsfTool.java:266)
        at org.sakaiproject.jsf.util.JsfTool.doPost(JsfTool.java:256)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
        at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:691)
        at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:469)
        at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:364)
        at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
        at org.sakaiproject.tool.impl.ActiveToolComponent$MyActiveTool.forward(ActiveToolComponent.java:459)
        at org.sakaiproject.portal.charon.SkinnableCharonPortal.forwardTool(SkinnableCharonPortal.java:1346)
        at org.sakaiproject.portal.charon.handlers.ToolHandler.doTool(ToolHandler.java:163)
        at org.sakaiproject.portal.charon.handlers.ToolHandler.doGet(ToolHandler.java:86)
        at org.sakaiproject.portal.charon.handlers.ToolHandler.doPost(ToolHandler.java:63)
        at org.sakaiproject.portal.charon.SkinnableCharonPortal.doPost(SkinnableCharonPortal.java:1187)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
        at org.sakaiproject.util.RequestFilter.doFilter(RequestFilter.java:592)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)

Is this about the limit for this setup, or do you think we could expect many more concurrent users?

Comments and suggestions are welcome!

/Daniel

------------------------------------------
Daniel Lind
UMDAC, Umeå universitet
901 87 Umeå Telefon: +46 90 786 53 12
Daniel.Lind at umdac.umu.se<mailto:Jorgen.Sondell at umdac.umu.se>
------------------------------------------

From: peter.crowther3 at googlemail.com [mailto:peter.crowther3 at googlemail.com] On Behalf Of Peter Crowther
Sent: den 20 augusti 2009 09:56
To: Daniel Lind
Cc: sakai-dev at collab.sakaiproject.org
Subject: Re: [Building Sakai] Load test of Sakai

2009/8/20 Daniel Lind <Daniel.Lind at umdac.umu.se<mailto:Daniel.Lind at umdac.umu.se>>
Hi!

We're investigating the limitations of Sakai when it comes to capacity of users. We have created some test plans in JMeter where users are taking tests consisting of 25 questions (multiple choice, true/false and Short answer) in Test&Quizzes. When we run this test we have come to these conclusions:

One Tomcat: Maximum of 430 simultaneous users from two JMeter instances.
Two Tomcat (on the same server): Maximum of 630 users from two JMeter instances.


When I say max it means the response times are way too long to be acceptable (connect >2s and response >10s).

Daniel, how much user "think time" are you allowing between responses?  With T&Q, in particular, you'd expect users to spend some time reading the question and working out the answer.

Also, as a matter of interest, what limit are you hitting first - CPU, RAM (and hence CPU due to GC or disk due to paging or reduced cache hits), disk i/o or network capacity?

- Peter
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://collab.sakaiproject.org/pipermail/sakai-dev/attachments/20090820/425e0aa1/attachment.html 


More information about the sakai-dev mailing list