tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Apache Wiki <wikidi...@apache.org>
Subject [Tomcat Wiki] Update of "HowTo/FasterStartUp" by KonstantinKolinko
Date Fri, 22 Nov 2013 20:24:21 GMT
Dear Wiki user,

You have subscribed to a wiki page or wiki category on "Tomcat Wiki" for change notification.

The "HowTo/FasterStartUp" page has been changed by KonstantinKolinko:
https://wiki.apache.org/tomcat/HowTo/FasterStartUp?action=diff&rev1=15&rev2=16

Comment:
Rework. Add introduction. Describe options to counter annotation scanning etc.

  = How do I make Tomcat startup faster? =
  
+ This section provides several recommendations on how to make your web application and Tomcat
as a whole to start up faster. Before we continue to specific tips and tricks, the general
advice is that if Tomcat hangs or is not responsive you have to perform diagnostics. That
is to take several thread dumps to see what Tomcat is really doing. See [[FAQ/Troubleshooting_and_Diagnostics|Troubleshooting
and Diagnostics]] page for details.
- == Jars ==
-  1.  Remove any jar files you don't need. When searching for classes every JAR file needs
to be examined to find the needed class. Also during webapp startup, jar files are searched
for TLD files. If the jar file is not there - there is nothing to search.
-  2.  Tomcat 7.+: You can add jars that do not need to be scanned for TLD files, Annotations
and Web fragments to the value of `tomcat.util.scan.DefaultJarScanner.jarsToSkip` property
in conf/catalina.properties file. Maybe later there would be a more convenient way to configure
this feature.
  
+ The Servlet 3.0 specification introduces support for
- == Memory ==
-  1.  Tweak memory parameters - Google is your friend.
  
+  *  `javax.servlet.ServletContainerInitializer` (shortened as SCI)
+  *  Web fragments (`META-INF/web-fragment.xml`)
+  *  Using annotations to define components of a web application (Servlets etc.)
+  *  Using annotations to define components processed by an SCI (`@HandlesTypes` annotation
on a SCI)
+  *  Packing web application resources in jar files (`META-INF/resources/*`)
  
+ These features are collectively referred as "plugability features" and are there to simplify
plugging of additional frameworks into a web application. See chapter 8 of Servlet 3.0 specification
for details.
- == Config ==
-  1.  Trim the config files as much as possible. XML parsing is not cheap. The less there
is to parse - the faster things will go.
  
- == Webapp ==
+ These features require scanning the JAR files. The worst is scanning for annotated classes.
There are a lot of class files to process and parsing a class file takes noticeable time.
  
+ It is possible to configure a web application to omit most of the scanning. It is also possible
to configure which JARs Tomcat should skip in its scanning.
-  1.  Make sure your code is not doing slow things. (Use a profiler)
-  2.  Remove any webapps you don't need. (So remove the all the webapps installed with tomcat)
-  3.  Add metadata-complete="true" attribute to the <web-app> element of your WEB-INF/web.xml
file, if you do not need the features that are enabled by the default value of "false" of
that attribute. This way Tomcat would not waste time scanning the libraries to autodiscover
annotated classes and web fragments.
  
- == Starting several web applications in parallel ==
+ Other features that require scanning are:
  
-  1.  With Tomcat 7.0.23+ you can configure it to start several web applications in parallel.
This is disabled by default but can be enabled by setting the `startStopThreads` attribute
of a '''Host''' to a value greater than one.
+  *  Discovery of tag libraries (`META-INF/**/*.tld`) (shortened as TLD scanning)
+ 
+ The TLD scanning happens when Tomcat needs to compile a JSP page. It does not affect the
startup time, but does affect the access time for the first not-yet-compiled JSP page in the
web application.
+ 
+ == Remove unnecessary JARs ==
+ 
+ Remove any JAR files you do not need. When searching for classes every JAR file needs to
be examined to find the needed class. If the jar file is not there - there is nothing to search.
+ 
+ Note that a web application should never have its own copy of Servlet API or Tomcat classes.
All those are provided by the container (Tomcat) and should never be present in the web application.
If you are using Apache Maven, such dependencies should be configured with `<scope>provided</scope>`.
See also a [[http://stackoverflow.com/questions/1031695/how-to-exclude-jars-generated-by-maven-war-plugin|
stackoverflow page]].
+ 
+ == Configure your web application ==
+ 
+ There are two options that can be specified in your `WEB-INF/web.xml` file:
+ 
+  1. `metadata-complete="true"` attribute on the `<web-app>` element.
+  2. an empty `<absolute-ordering />` element.
+ 
+ "`metadata-complete="true"`" disables scanning your web application and its libraries for
classes that use annotations to define components of a web application (Servlets etc.). This
option is not enough to disable all of annotation scanning. If there is a SCI with a @HandlesTypes
annotation, Tomcat has to scan your application for classes that use annotations or interfaces
specified in that @HandlesTypes annotation and provide the list of such classes to the SCI.
+ 
+ An example of such SCI is in the WebSocket API implementation jar (`tomcat-websocket.jar`,
`tomcat7-websocket.jar`) which is included with Tomcat 7 starting with 7.0.47.
+ 
+ The "`<absolute-ordering>`" element specifies which web fragment JARs (according to
the names in their `WEB-INF/web-fragment.xml` files) have to be scanned for SCIs, fragments
and annotations. If you specify an empty "`<absolute-ordering/>`" it means that none
of that scanning will occur. This feature does not affect scanning for web application resources.
+ 
+ == Exclude JARs from scanning ==
+ 
+ In Tomcat 7 JAR files can be excluded from scanning by listing their names or name patterns
in a [[http://tomcat.apache.org/tomcat-7.0-doc/config/systemprops.html#JAR_Scanning|system
property]]. Those are usually configured in the `conf/catalina.properties` file.
+ 
+ In Tomcat 8 you can use a [[http://tomcat.apache.org/tomcat-8.0-doc/config/systemprops.html#JAR_Scanning|system
property]] or configure a `<JanScanFilter>` [[http://tomcat.apache.org/tomcat-8.0-doc/config/jar-scan-filter.html|
element]] in the [[http://tomcat.apache.org/tomcat-8.0-doc/config/context.html|context file]]
of your web application.
  
  == Entropy Source ==
-  1.  Tomcat 7+ heavily relies on !SecureRandom class to provide random values for its session
ids and in other places. Depending on your JRE it can cause delays during startup if entropy
source that is used to initialize !SecureRandom is short of entropy. You will see warning
in the logs when this happens, e.g.:
+ Tomcat 7+ heavily relies on !SecureRandom class to provide random values for its session
ids and in other places. Depending on your JRE it can cause delays during startup if entropy
source that is used to initialize !SecureRandom is short of entropy. You will see warning
in the logs when this happens, e.g.:
  
  {{{
  <DATE> org.apache.catalina.util.SessionIdGenerator createSecureRandom
  INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took
[5172] milliseconds.
  }}}
  
-  There is a way to configure JRE to use a non-blocking entropy source by setting the following
system property: `-Djava.security.egd=file:/dev/./urandom`
+ There is a way to configure JRE to use a non-blocking entropy source by setting the following
system property: `-Djava.security.egd=file:/dev/./urandom`
  
-  Note the "`/./`" characters in the value. They are needed to work around known [[http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6202721|JRE
bug #6202721]].
+ Note the "`/./`" characters in the value. They are needed to work around known [[http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6202721|Oracle
JRE bug #6202721]].
  
-  Also note that replacing the blocking entropy source (/dev/random) with a non-blocking
one actually reduces security because you are getting less-random data. If you have a problem
generating entropy on your server (which is common), consider looking into entropy-generating
hardware products such as "EntropyKey".
+ Also note that replacing the blocking entropy source (/dev/random) with a non-blocking one
actually reduces security because you are getting less-random data. If you have a problem
generating entropy on your server (which is common), consider looking into entropy-generating
hardware products such as "EntropyKey".
+ 
+ == Starting several web applications in parallel ==
+ 
+ With Tomcat 7.0.23+ you can configure it to start several web applications in parallel.
This is disabled by default but can be enabled by setting the `startStopThreads` attribute
of a '''Host''' to a value greater than one.
+ 
+ == Memory ==
+ 
+ Tweak memory parameters - Google is your friend.
+ 
+ 
+ == Config ==
+ 
+ Trim the config files as much as possible. XML parsing is not cheap. The less there is to
parse - the faster things will go.
+ 
+ == Webapp ==
+ 
+  1.  Remove any webapps you don't need. (So remove the all the webapps installed with tomcat)
+  2.  Make sure your code is not doing slow things. (Use a profiler)
+ 
  ----
  [[CategoryFAQ]]
  

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Mime
View raw message