ハングしちゃうんですけど!(Grails 0.5+オリジナルパッチ)
コントローラ中でrender "hogehoe"したときと、GSPに飛ばしたとき(レイアウトがあるとき、ないとき)とでどれくらいスループットが変わるかをテストすることにした。
Windowsだとそもそもソケット周りが耐え切れないと思って、Linux(CentOS) on VMWare(仮想CPU数2)上のTomcatでアプリケーションを実行し、ApacheBench(ab)で -c 100 -n 10000 とかのパラメタで実行。
ところが、どうもハングしたみたいで、いつまでたっても返ってこない。
JProfilerを使用して、再度Tomcatを実行してApacheBenchで負荷をかけてみた。
2103秒間ブロックされてるって(スクリーンショットを参照のこと。見えないと思うけど)!
待っているスレッドのスタックトレースは以下のとおり。
org.codehaus.groovy.runtime.metaclass.MemoryAwareConcurrentReadMap.lockWrite() org.codehaus.groovy.runtime.metaclass.MemoryAwareConcurrentReadMap.get(java.lang.Object) org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.getMetaClass(java.lang.Class) groovy.lang.MetaClassRegistry.getMetaClass(java.lang.Class) org.codehaus.groovy.runtime.Invoker.getMetaClass(java.lang.Object) org.codehaus.groovy.runtime.InvokerHelper.getMetaClass(java.lang.Object) groovy.lang.Closure.<init>(java.lang.Object, java.lang.Object) Test01Controller$_closure2.<init>(java.lang.Object, java.lang.Object) Test01Controller.<init>() java.lang.Class.newInstance() org.codehaus.groovy.grails.commons.AbstractGrailsClass.newInstance() java.lang.reflect.InvocationHandler.invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[ ]) $Proxy3.newInstance() org.springframework.context.ApplicationContext.getBean(java.lang.String) org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsControllerHelper.getControllerInstance(org.codehaus.groovy.grails.commons.GrailsControllerClass) org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsControllerHelper.handleURI(java.lang.String, org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest, java.util.Map) org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsControllerHelper.handleURI(java.lang.String, org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest) org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsController.handleRequest(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) org.springframework.web.servlet.HandlerAdapter.handle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object) org.codehaus.groovy.grails.web.servlet.GrailsDispatcherServlet.doDispatch(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) javax.servlet.http.HttpServlet.service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) URL: /pagetest-0.1/grails/test01.dispatch javax.servlet.http.HttpServlet.service(javax.servlet.ServletRequest, javax.servlet.ServletResponse) org.codehaus.groovy.grails.web.mapping.filter.UrlMappingsFilter.doFilterInternal(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, javax.servlet.FilterChain) com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, javax.servlet.FilterChain) com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, javax.servlet.FilterChain) org.apache.tomcat.util.net.JIoEndpoint$Worker.run()
ブロックして(待たせて)いるほうのスレッドのスタックトレースは以下のとおり。
java.lang.Object.wait() org.codehaus.groovy.runtime.metaclass.MemoryAwareConcurrentReadMap.waitForWriteState() org.codehaus.groovy.runtime.metaclass.MemoryAwareConcurrentReadMap.put(java.lang.Object, java.lang.Object) org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.getMetaClass(java.lang.Class) groovy.lang.MetaClassRegistry.getMetaClass(java.lang.Class) org.codehaus.groovy.runtime.Invoker.invokeStaticMethod(java.lang.Class, java.lang.String, java.lang.Object) org.codehaus.groovy.runtime.InvokerHelper.invokeStaticMethod(java.lang.Class, java.lang.String, java.lang.Object) org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeStaticMethodN(java.lang.Class, java.lang.Class, java.lang.String, java.lang.Object[ ]) Test01Controller.<init>() java.lang.Class.newInstance() org.codehaus.groovy.grails.commons.AbstractGrailsClass.newInstance() java.lang.reflect.InvocationHandler.invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[ ]) $Proxy3.newInstance() org.springframework.context.ApplicationContext.getBean(java.lang.String) org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsControllerHelper.getControllerInstance(org.codehaus.groovy.grails.commons.GrailsControllerClass) org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsControllerHelper.handleURI(java.lang.String, org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest, java.util.Map) org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsControllerHelper.handleURI(java.lang.String, org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest) org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsController.handleRequest(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) org.springframework.web.servlet.HandlerAdapter.handle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object) org.codehaus.groovy.grails.web.servlet.GrailsDispatcherServlet.doDispatch(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) javax.servlet.http.HttpServlet.service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) URL: /pagetest-0.1/grails/test01.dispatch javax.servlet.http.HttpServlet.service(javax.servlet.ServletRequest, javax.servlet.ServletResponse) org.codehaus.groovy.grails.web.mapping.filter.UrlMappingsFilter.doFilterInternal(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, javax.servlet.FilterChain) com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, javax.servlet.FilterChain) com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, javax.servlet.FilterChain) org.apache.tomcat.util.net.JIoEndpoint$Worker.run()
これって、Groovyかな。pageEncodingパッチのせいじゃないよねぇ? http://jira.codehaus.org/browse/GRAILS みても、issueが多くて既に登録されているのか良く分からない...