George, thanks for sharing your experience, good to know I'm not the first
down this path.  I'd be interested to know if you've tested at all with
Tomcat 8 and what your findings were, if so.  Based on my experience I'd
expect you to be in a similar boat to us.

Mark, thanks for the reply.  I've uploaded my "dummy" webapp here:

http://filebin.ca/2XCPi8oAdy84/test.war

As for the JAR scanning / startup times, with Tomcat 8's jarsToScan setting
I'm confident we'd be able to manage that, and am happy to leapfrog over
Tomcat 7. It's the memory utilization in Tomcat 8 specifically, independent
of JAR scanning, that's the show-stopper for us.  Let me know if I can
provide any other info, and thanks again.



On Tue, Feb 16, 2016 at 12:58 PM Mark Thomas <ma...@apache.org> wrote:

> On 16/02/2016 16:13, Ty wrote:
> > Summary:
> >
> > Because of our use case (hundreds of webapps per instance), we cannot
> > feasibly upgrade our Tomcat 6 containers to Tomcat 7 or Tomcat 8, due to
> > the massive increase in memory the upgrade causes.
> >
> > Background:
> >
> > We’ve been running Tomcat 6 for several years, on perhaps an unusual
> scale:
> > several dozen Tomcat instances, each running up to a *few hundred
> webapps*
> > in a single container.  (Picture a cloud service provider with several
> > products and hundreds of customers, with one dedicated webapp
> > per-customer-per-product, resulting in many thousands of web
> > applications.  It’s
> > not ideal but it’s how the software was designed).  Typical max heap
> sizes
> > per container are 1GB to 4GB depending on utilization, and max container
> > startup times are in the neighborhood of 5 to 10 minutes.
> >
> > ·         When Tomcat 7 was released, our testing showed a 10-to-20-fold
> > increase in memory consumption and a 3-to-5-fold increase in startup time
> > for our test case (100 deployed webapps).  After some digging we
> determined
> > that these increases were related to JAR scanning
> > (tomcat.util.scan.DefaultJarScanner).
>
> JAR scanning should be transient. What was it that was causing the 10-20
> fold increase?
>
> > ·         When Tomcat 8 was released, we noted that it included a
> > “whitelist” version of the jarsToSkip Property, jarsToScan.  Our hopes
> were
> > high that we could skip from Tomcat 6 to Tomcat 8, but our test case
> (again
> > 100 deployed webapps) quickly deflated those hopes:  similar startup
> times
> > but at least a *30-fold increase in memory consumption*, regardless of
> how
> > we configure jarsToScan or jarsToSkip.
> >
> > ·         A heap dump analysis showed that the Tomcat 8 memory increase
> was
> > largely due to the size/count of
> > org.apache.catalina.webresources.JarResourceSet objects.
>
> Those are only going to be created when a JAR is found that contains
> META-INF/resources. The spec requires Tomcat to expose those as static
> resources and that requires plumbing. Note Tomcat 6 will just ignore
> these because the spec is to old for this feature.
>
> > We attempted to
> > reduce this by setting the Context/Resources@cachingAllowed atttribute
> to
> > “false” and also tried to tune the “cacheMaxSize” and
> “cacheObjectMaxSize”
> > attributes.
>
> Those attributes should have no impact on the number or size of the
> JarResourceSet instances.
>
> > The only effect that came from these changes was a change in
> > the object that took up all the space:  instead of
> > org.apache.catalina.webresources.JarResourceSet objects, they are
> > org.apache.catalina.webresources.StandardResourceSet objects, taking up
> > roughly the same amount of space.
>
> Strange. Very strange.
>
> > Question:
> >
> > Is there anything else we can adjust to make Tomcat 8’s memory
> consumption
> > closer to that of Tomcat 6’s, for our use case?
>
> It is hard to see exactly what is going on here. The symptoms you
> describe and the resulting changes with configuration are not consistent
> with how I would expect Tomcat to behave nor can I see how it might
> behave in the way described.
>
> > If not, we are faced with
> > either running Tomcat 6 past its EOL, or possibly maintaining a very
> large
> > jarsToSkip blacklist in Tomcat 7 (until its EOL).  It is not economically
> > feasible for us to increase the physical memory of our servers by 30x so
> we
> > can run Tomcat 8.
> >
> > Test procedure:
> >
> >
> >    - Create a "dummy" webapp (using default Maven archetype) named
> test.war
> >    - Add several popular Maven dependencies such that the total size of
> the
> >    JARs in WEB-INF/lib is about 30MB
>
> Can you provide the sample project? It makes sense to ensure we are
> working from the same baseline. I wonder if the libraries themselves are
> a factor here.
>
> >    - Download the latest versions of Tomcat 6, 7, and 8.
> >    - Set Java environment variables for a JMX listener and a 3GB max heap
> >    - Make 100 copies of test.war (test1.war, test2.war, …, test100.war)
> and
> >    drop them in /webapps.
> >    - Start the container, note the reported startup time, perform an
> >    explicit major GC, and note the heap utilization.
> >    - Run each test several times and average the results
>
> That is a nice simple test we should be able to repeat.
>
> > Test results:
> >
> > Case 1 (baseline):
> >
> >
> >
> > +---------+--------------+---------------------------+
> > | version | startup time | heap usage after major GC |
> > +---------+--------------+---------------------------+
> > | tomcat6 | 36,711ms     | 21,163,288                |
> > | tomcat7 | 104,517ms    | 489,992,264               |
> > | tomcat8 | 156,094ms    | 1,010,512,568             |
> > +---------+--------------+---------------------------+
> >
> >
> > Case 2 (Tomcat 7 and 8 with “jarsToSkip=*”)
> >
> > +---------+--------------+---------------------------+
> > | version | startup time | heap usage after major GC |
> > +---------+--------------+---------------------------+
> > | tomcat6 | 36,711ms     | 21,163,288                |
> > | tomcat7 | 38,979ms     | 72,359,840                |
> > | tomcat8 | 52,040ms     | 633,682,336               |
> > +---------+--------------+---------------------------+
>
> From those figures my impression is that we should be able to do
> something about the memory. The start-up time with JAR scanning is what
> it is. Without JAR scanning there might be scope for improvement.
>
> Mark
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
> For additional commands, e-mail: users-h...@tomcat.apache.org
>
>

Reply via email to