Kito D. Mann created MYFACES-3603:
-------------------------------------

             Summary: HIGH CPU inflating bytes in 
ResourceHandlerImpl.handleResourceRequest
                 Key: MYFACES-3603
                 URL: https://issues.apache.org/jira/browse/MYFACES-3603
             Project: MyFaces Core
          Issue Type: Bug
    Affects Versions: 2.1.7
            Reporter: Kito D. Mann
            Priority: Critical


In a high concurrency load test with Apache MyFaces + RichFaces component 
library we found that under peak load majority of our web container threads 
were stuck in this call stack

at java/util/zip/Inflater.inflateBytes(Native Method) at 
java/util/zip/Inflater.inflate(Inflater.java:249(Compiled Code)) at 
java/util/zip/InflaterInputStream.read(InflaterInputStream.java:146(Compiled 
Code)) at 
java/util/zip/InflaterInputStream.read(InflaterInputStream.java:116(Compiled 
Code)) at java/io/FilterInputStream.read(FilterInputStream.java:77(Compiled 
Code)) at java/io/FilterInputStream.read(FilterInputStream.java:77(Compiled 
Code)) at 
java/io/PushbackInputStream.read(PushbackInputStream.java:133(Compiled Code)) 
at 
org/apache/myfaces/shared_impl/resource/ResourceImpl$ValueExpressionFilterInputStream.read(ResourceImpl.java:117(Compiled
 Code)) at java/io/InputStream.read(InputStream.java:175(Compiled Code)) at 
java/io/InputStream.read(InputStream.java:97(Compiled Code)) at 
org/apache/myfaces/application/ResourceHandlerImpl.pipeBytes(ResourceHandlerImpl.java:402(Compiled
 Code)) at 
org/apache/myfaces/application/ResourceHandlerImpl.handleResourceRequest(ResourceHandlerImpl.java:357(Compiled
 Code)) at 
org/richfaces/resource/ResourceHandlerImpl.handleResourceRequest(ResourceHandlerImpl.java:257(Compiled
 Code)) at 
javax/faces/webapp/FacesServlet.service(FacesServlet.java:183(Compiled Code)) 
at 
org/richfaces/webapp/ResourceServlet.httpService(ResourceServlet.java:110(Compiled
 Code)) at 
org/richfaces/webapp/ResourceServlet.service(ResourceServlet.java:105(Compiled 
Code))

After looking at the src code of 
org.apache.myfaces.application.ResourceHandlerImpl.handleResourceRequest(FacesContext)
 I can see that the ResourceHandlerCache caches the Resource metadata ; however 
the actual output of the resource which is written to the outputstream in 
ResourceHandlerImpl.pipeBytes is NEVER cached.

This causes a scalability problem in our case because each access to the 
resource involves cracking open a jar, inflating the bytes and parsing a stream 
of bytes. This is done multiple times for the same resource(say a css file) 
inside the richfaces jar inspite of the resource not changing.

I propose a much needed performance optimization wherein we cache the output of 
the Resource handled and stash the output byte[] it as softReference in the 
ResourceHandlerCache.ResourceValue.

I have attached a patch that does the same and would like your feedback on my 
proposal. These patches are from src taken from Apache MyFaces 2.0.5

-cheers, Rohit Kelapure, Apache Open WebBeans committer 

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to