ICEfaces
  1. ICEfaces
  2. ICE-1473

cpu overload from fetching CSS resources with gzip encoding

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 1.6DR#3
    • Fix Version/s: 1.6DR#4, 1.6
    • Component/s: Framework
    • Labels:
      None
    • Environment:
      multiprocessor server, jdk 1.5
    • Workaround Exists:
      Yes
    • Workaround Description:
      turn off accept gzip in the browser; however, this is not likely an acceptable workaround for most users

      Description


      CSS resources can be served stressfully with the following script:

      while true; do for x in 1 2 3 4 5 6 7 8 9 0; do curl -H "Accept-Encoding: gzip,deflate" -O http://vorlon.ice:8080/component-showcase/xmlhttp/css/xp/css-images/over-right-mid.gif -O http://vorlon.ice:8080/component-showcase/xmlhttp/css/xp/xp.css& done; sleep 1; done

      When this is run against a multiprocessor machine (both mac and linux have been tested),
      after a short period the CPU utilization will go to 100% and will not subside until the server is killed. A typical thread in this state is the following:

        [1] java.util.zip.Deflater.deflateBytes (native method)
        [2] java.util.zip.Deflater.deflate (Deflater.java:284)
        [3] java.util.zip.DeflaterOutputStream.deflate (DeflaterOutputStream.java:154)
        [4] java.util.zip.DeflaterOutputStream.write (DeflaterOutputStream.java:114)
        [5] java.util.zip.GZIPOutputStream.write (GZIPOutputStream.java:72)
        [6] com.icesoft.faces.webapp.http.common.standard.CompressingServer.copy (CompressingServer.java:72)
        [7] com.icesoft.faces.webapp.http.common.standard.CompressingServer.access$200 (CompressingServer.java:15)
        [8] com.icesoft.faces.webapp.http.common.standard.CompressingServer$CompressingResponse.writeBodyFrom (CompressingServer.java:65)
        [9] com.icesoft.faces.webapp.http.core.ServeCSSResource$1.respond (ServeCSSResource.java:32)
        [10] com.icesoft.faces.webapp.http.common.standard.CacheControlledServer$EnhancedRequest$1.respond (CacheControlledServer.java:70)
        [11] com.icesoft.faces.webapp.http.common.standard.CompressingServer$CompressingRequest$1.respond (CompressingServer.java:44)
        [12] com.icesoft.faces.webapp.http.servlet.ServletRequestResponse.respondWith (ServletRequestResponse.java:121)
        [13] com.icesoft.faces.webapp.http.common.standard.CompressingServer$CompressingRequest.respondWith (CompressingServer.java:42)
        [14] com.icesoft.faces.webapp.http.common.standard.CacheControlledServer$EnhancedRequest.respondWith (CacheControlledServer.java:63)
        [15] com.icesoft.faces.webapp.http.core.ServeCSSResource.service (ServeCSSResource.java:29)
        [16] com.icesoft.faces.webapp.http.common.standard.CacheControlledServer.service (CacheControlledServer.java:42)
        [17] com.icesoft.faces.webapp.http.common.standard.PathDispatcherServer$Matcher.serviceOnMatch (PathDispatcherServer.java:50)
        [18] com.icesoft.faces.webapp.http.common.standard.PathDispatcherServer.service (PathDispatcherServer.java:19)
        [19] com.icesoft.faces.webapp.http.common.standard.CompressingServer.service (CompressingServer.java:26)
        [20] com.icesoft.faces.webapp.http.core.ResourceServer.service (ResourceServer.java:30)
        [21] com.icesoft.faces.webapp.http.servlet.BasicAdaptingServlet.service (BasicAdaptingServlet.java:16)
        [22] com.icesoft.faces.webapp.http.servlet.PathDispatcher$Matcher.serviceOnMatch (PathDispatcher.java:41)
        [23] com.icesoft.faces.webapp.http.servlet.PathDispatcher.service (PathDispatcher.java:18)
        [24] com.icesoft.faces.webapp.http.servlet.MainServlet.service (MainServlet.java:47)
        [25] javax.servlet.http.HttpServlet.service (HttpServlet.java:802)
        [26] org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:237)
        [27] org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:157)
        [28] org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.java:214)
        [29] org.apache.catalina.core.StandardValveContext.invokeNext (StandardValveContext.java:104)
        [30] org.apache.catalina.core.StandardPipeline.invoke (StandardPipeline.java:520)
        [31] org.apache.catalina.core.StandardContextValve.invokeInternal (StandardContextValve.java:198)
        [32] org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:152)
        [33] org.apache.catalina.core.StandardValveContext.invokeNext (StandardValveContext.java:104)
        [34] org.apache.catalina.core.StandardPipeline.invoke (StandardPipeline.java:520)
        [35] org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:137)
        [36] org.apache.catalina.core.StandardValveContext.invokeNext (StandardValveContext.java:104)
        [37] org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:118)
        [38] org.apache.catalina.core.StandardValveContext.invokeNext (StandardValveContext.java:102)
        [39] org.apache.catalina.core.StandardPipeline.invoke (StandardPipeline.java:520)
        [40] org.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java:109)
        [41] org.apache.catalina.core.StandardValveContext.invokeNext (StandardValveContext.java:104)
        [42] org.apache.catalina.core.StandardPipeline.invoke (StandardPipeline.java:520)
        [43] org.apache.catalina.core.ContainerBase.invoke (ContainerBase.java:929)
        [44] org.apache.coyote.tomcat5.CoyoteAdapter.service (CoyoteAdapter.java:160)
        [45] org.apache.coyote.http11.Http11Processor.process (Http11Processor.java:799)
        [46] org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection (Http11Protocol.java:705)
        [47] org.apache.tomcat.util.net.TcpWorkerThread.runIt (PoolTcpEndpoint.java:577)
        [48] org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run (ThreadPool.java:683)
        [49] java.lang.Thread.run (Thread.java:613)

      By instrumenting the CompressingServer, it has been verified that the CPU activity is occurring only in the java.util.zip package. This is likely a zip implementation bug (lack of thread safety, perhaps in a native library) so the fix may be either to disable gzip encoding or to apply our own locking to ensure single threaded access to the gzip library.

        Activity

        Ted Goddard created issue -
        Ted Goddard made changes -
        Field Original Value New Value
        Environment multiprocessor machines multiprocessor server, jdk 1.5
        Ted Goddard made changes -
        Assignee Mircea Toma [ mircea.toma ]
        Mircea Toma made changes -
        Status Open [ 1 ] Resolved [ 5 ]
        Resolution Fixed [ 1 ]
        Ken Fyten made changes -
        Fix Version/s 1.6DR#4 [ 10060 ]
        Ken Fyten made changes -
        Fix Version/s 1.6 [ 10031 ]
        Ken Fyten made changes -
        Status Resolved [ 5 ] Closed [ 6 ]
        Assignee Mircea Toma [ mircea.toma ]

          People

          • Assignee:
            Unassigned
            Reporter:
            Ted Goddard
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: