> JAR scanning should be transient. What was it that was causing the 10-20 > fold increase?
>From memory (this was a while ago), it was related to java.util.jar.Manifest objects, or what they contained/referenced. I'd be glad to do another heap analysis and summarize it if it would help, but even more glad to just skip Tomcat 7 altogether. On Tue, Feb 16, 2016 at 2:11 PM Ty <ty733...@gmail.com> wrote: > 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 >> >>