Agenda Tomcat Versions Troubleshooting management Tomcat Connectors HTTP Protocal and Performance Log Tuning JVM Tuning Load balancing Tomcat
Tomcat Performance Tuning Tomcat Versions
Application/System Monitoring Setup a system to monitor performance over time, Need a baseline to compare normal from abnormal performance Espcially true as dev/test is never a true copy of prod Caveats - typical web server requests spends 80% of its time in application code so most likely area for optimisation.
Tomcat Performance Tuning Servelt 3.0 Spec (Dec 2009) Tomcat 7.0.6 Stable support (Jan 2011) Asynchronous servlets Before only synchronous servlets servlet thread has to wait for any background process to finish before being returned to pool. Now servlet can returnt the thread to the pool while background process is running
Tomcat Config
Tomcat Connectors Most tweaking in Tomcat done with connector parameters. Two connector types Protocol = determines connector type if not specified default to HTTP Connector HTTP connector AJP connector used when tomcat is behind a web server Server Shutdown 8005 (not a connector)
HTTP Connector HTTP Connector 8080 org.apache.coyote.http11.http11protocol (java BIO) org.apache.coyote.http11.http11nioprotocol (java NBIO) unstable? org.apache.coyote.http11.http11aprprotocol (native connector) Connector protocol attribute: HTTP/1.1 uses coyote http 1.1
HTTP Connector Comparison Comparison Table
AJP Connector AJP (Apache JServe Protocol) Connector 8009 org.apache.coyote.ajp.ajpprotocol org.apache.coyote.ajp.ajpnioprotocol (experimental) org.apache.coyote.ajp.ajpaprprotocol Connector protocol attribute: HTTP/1.1 uses coyote http 1.1
AJP Connector AJP (Apache JServe Protocol) Connector 8009 org.apache.coyote.ajp.ajpprotocol org.apache.coyote.ajp.ajpnioprotocol (experimental) org.apache.coyote.ajp.ajpaprprotocol Connector protocol attribute: AJP Uses coyote.ajp.ajpprotocol
AJP Connector Comparison Comparison Table
Apache mod_proxy Pros No need for a separate module compilation and maintenance. mod_proxy, mod_proxy_http, mod_proxy_ajp and mod_proxy_balancer comes as part of standard Apache 2.2+ distribution Ability to use http https or AJP protocols, even within the same balancer. * thanks to blogs.jboss.org
Apache mod_proxy Cons: mod_proxy_ajp does not support large 8K+ packet sizes. Basic load balancer Does not support Domain model clustering
Apache - mod_jk mod_jk - Pros: Cons: Advanced load balancer Advanced node failure detection Support for large AJP packet sizes up to 64K Need to build and maintain a separate module (not really an issue for most Linux distributions)
HTTP KeepAlive HTTP persistent connection, also called HTTP keep-alive, or HTTP connection reuse, is the idea of using the same TCP connection to send and receive multiple HTTP requests/responses, as opposed to opening a new connection for every single request/response pair Wikipedia.
HTTP KeepAlive Advantages The good: Less CPU and memory usage (because fewer connections are open simultaneously) Enables HTTP pipelining of requests and responses Reduced network congestion (fewer TCP connections) Reduced latency in subsequent requests (no handshaking) Errors can be reported without the penalty of closing the TCP connection Disadvantages The bad Wasted server resources, thread idle while others waiting to be serviced,
HTTP KeepAlive Advantages The good: Less CPU and memory usage (because fewer connections are open simultaneously) Enables HTTP pipelining of requests and responses Reduced network congestion (fewer TCP connections) Reduced latency in subsequent requests (no handshaking) Errors can be reported without the penalty of closing the TCP connection Disadvantages The bad Wasted server resources, thread idle while others waiting to be serviced,
HTTP KeepAlive Was a good idea a few years ago. Web 2.0/Ajax maybe not a good idea
Connectors and KeepAlive KeepAlive 2 parameters MaxKeepAliveRequests max number of requests to serve before closing, ConnectionTimeOut max time to keep thread open MaxKeepAliveRequests Set to 1 for high concurrency, not using SSL, (disables keep alive) Set to >1 for SSL, low concurrency
Connectors and KeepAlive ConnectionTimeout - Default = 20 seconds! ConnectionTimeout="20000" too high turn down to +/- 3000 3 seconds If using Apache HTTP set to disable, let apache http handle keep-alive, also do SSL on Apache
Which HTTP Connector To Use? BIO use when: Stablity is important, Keep alive not a limiting factor, Content is dynamic, APR use when: (Almost always) faster, especially for SSL, not an issue if using SSL on Apache http, Lots of static content (sendfile) Keep alive NB factor
Which AJP Connector To Use? Usually Apache and Tomcat are on the same server or at least on the same LAN. TCP handshake setup not a limiting factor Let Apache do the SSL and keepalive management Use APR unless there is stability issues
Tomcat Load Balancing/Clustering Difference between load balancing/clustering (Layer 7) Session replication, Server affinity Load Balancing/Clustering Options Typical Setup Apache mod_proxy, mod_jk Tomcat Clustering Host or Engine level,
Thread Executors Share Thread Pool between applications, new in Tomcat 6 More efficient use of resources by applications Must be setuo before connector in server.xml
Thread Executors Executor Example
Tomcat Caching Static Content BIO blocks when sending static content, APR uses SEND_FILE, - frees worker thread <Context cachemaxsize= 5120 cachettl= 60000 cachingallowed= true > Set cache size to 50MB, default 10MB and ttl on cache to 60 seconds, default is 5 seconds
JVM Tweaking Make sure JVM is in server mode, Set -Xms/-Xmx to approrpiate levels. Not to high or too low, Check cause of out of memory errors if permgen space increase heap will make it worse -XX:PermSize, - XX:MaxPermSize Change gcc algorithms
JVM Tweaking Serial: -XX:+UseSerialGC Parallel: -XX:+UseParallelGC (aka Throughput collector) Parallel Old: -XX:+UseParallelOldGC(aka Parallel Compacting Collector) Concurrency Collector: -XX: +UseConcMarkSweepGC aka (CMS or low-latency collector)
JVM Tweaking Weak generational hypothesis most objects die young. faster GC collection in Eden
JVM Tweaking -XX:NewRatio=N - Ratio of new gen to old gen -XX:NewSize=N - Default new gen size -XX:MaxNewSize=N - Max for new gen size
Tomcat Logging Logging.properties Uses customised logger based on apache.commons.logging Root logger had two handlers defiend a file handler and console handler but in most Linux distributions this is redirected to a file disable one for speed improvement.handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.consolehandler.handlers = 1catalina.org.apache.juli.FileHandler
Out of Memory Jumping Bean Www.JumpingBean.co.za Unit 3 Appian Place, 373 Kent Ave, Ferndale South Africa +2711 781 8014