{"id":10391,"date":"2019-12-27T07:30:48","date_gmt":"2019-12-27T12:30:48","guid":{"rendered":"https:\/\/www.eginnovations.com\/blog\/?p=10391"},"modified":"2024-12-10T05:05:11","modified_gmt":"2024-12-10T10:05:11","slug":"tomcat-performance-tuning","status":"publish","type":"post","link":"https:\/\/www.eginnovations.com\/blog\/tomcat-performance-tuning\/","title":{"rendered":"10 Tips for Apache Tomcat performance tuning"},"content":{"rendered":"<div class=\"inner_content\">\n<h2><span class=\"ez-toc-section\" id=\"Get_maximum_performance_from_Apache_Tomcat\"><\/span>Get maximum performance from Apache Tomcat<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>A question we often get asked by customers is: what <a href=\"https:\/\/www.eginnovations.com\/blog\/tomcat-performance-tuning\/\">Tomcat performance tuning<\/a> can they do to improve the overall performance. This guide is everything we know about tuning Apache Tomcat for maximum performance.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignright wp-image-10397\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tuning-apache-tomcat.jpg\" alt=\"Tuning Apache Tomcat improves performance\" width=\"300\" height=\"200\" border=\"0\" srcset=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tuning-apache-tomcat.jpg 300w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tuning-apache-tomcat-140x93.jpg 140w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p><a href=\"https:\/\/tomcat.apache.org\/\">Apache Tomcat<\/a>, developed by the Apache Software Foundation, is an open source Java servlet container that also functions as a web server. While over 100,000 websites rely on Tomcat as a web server, a Plumbr survey of Java application servers showed that over 60% of websites that use Java technology relied on Apache Tomcat to host the business logic.<\/p>\n<p>Production environments must be high performing. This requires that Apache Tomcat be configured to handle the maximum load possible and yet provide the best response time to users. The performance that an application server delivers is often dependent on how well it is configured. Often the default settings provided are non-optimal.<\/p>\n<p>At eG Innovations, our eG Enterprise <a class=\"link\" href=\"https:\/\/www.eginnovations.com\/product\/features\">IT performance monitoring solution<\/a> uses Apache Tomcat as the web server. Over the years, we have discovered several tips and tricks for configuring Tomcat to achieve the highest level of scalability possible. This blog post documents our learnings on best practices that you should employ when deploying Tomcat in production.<\/p>\n<p><a href=\"https:\/\/www.eginnovations.com\/supported-technologies\/tomcat-monitoring?utm_source=blog&amp;utm_medium=banner&amp;utm_campaign=tomcat_performance&amp;utm_content=tomcat_monitoring\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11325\" style=\"margin: 15px auto;\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/Tomcat-java-2.jpg\" alt=\"Tomcat-java-2\" width=\"640\" height=\"120\" border=\"0\" srcset=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/Tomcat-java-2.jpg 640w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/Tomcat-java-2-300x56.jpg 300w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/Tomcat-java-2-310x58.jpg 310w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/Tomcat-java-2-140x26.jpg 140w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/a><\/p>\n<h2><span class=\"ez-toc-section\" id=\"A_holistic_approach_is_needed_for_tuning_Tomcat_performance\"><\/span>A holistic approach is needed for tuning Tomcat performance<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>A first step to achieving high performance is to recognize that tuning the Tomcat application server alone is not sufficient. After all, Tomcat runs on top of a <a class=\"link\" href=\"https:\/\/www.eginnovations.com\/supported-technologies\/jvm-monitoring\">Java virtual machine<\/a> (JVM). So, a poorly configured JVM will compromise performance. Likewise, the JVM runs on an operating system and it is important to have the best possible operating system configuration to achieve the highest performance possible. Even bottlenecks in the <a class=\"link\" href=\"https:\/\/www.eginnovations.com\/blog\/java-code-level-visibility\/\">application code<\/a> can result in &#8220;Tomcat is slow&#8221; complaints. All in all, a holistic approach must be taken for Tomcat performance tuning.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-10402 size-full\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-performance-tuning.png\" alt=\"Image listing 4 key areas for Tomcat tuning to improve performance - Application code, Tomcat Container, JVM and OS\" width=\"310\" height=\"347\" border=\"0\" \/><\/p>\n<div class=\"img_caption\" style=\"margin-top: 0px !important;\">Performance tuning must be done at every layer: the operating system, JVM, Tomcat container, and at the application code level<\/div>\n<p>In the following sections, we will present best practices to configure the operating system, JVM, Tomcat container, and application code for best possible performance.<\/p>\n<h2 class=\"h3_head_style\"><span class=\"ez-toc-section\" id=\"Configuring_the_operating_system_for_higher_Tomcat_performance\"><\/span>Configuring the operating system for higher Tomcat performance<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul class=\"tomcat_list_style\">\n<li><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-10423\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-operating-system.png\" alt=\"Tomcat operating system must be tuned for continued high performance.\" width=\"200\" height=\"150\" border=\"0\" srcset=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-operating-system.png 200w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-operating-system-140x105.png 140w\" sizes=\"auto, (max-width: 200px) 100vw, 200px\" \/>Ensure that the server operating system is sized correctly for the expected workload. Monitor the utilization of server CPU and memory to ensure that there are no CPU and memory bottlenecks. To achieve best performance, use a 64-bit operating system.<\/li>\n<li>For best performance, ensure that a dedicated system is provided for Tomcat. If the system being used is a virtual machine, ensure that VM Ready time is low (well below 5%), which means that the VM is getting CPU when it needs it. In a cloud environment, make sure that the server\u2019s resource usage is not hitting any resource configuration limit (e.g., DTU usage is not close to 100% in Microsoft Azure).<\/li>\n<li>There are also a number of well documented operating system tweaks that should be applied to get the maximum performance. For instance, for a Linux system, ensure that the limit of open files is high enough that it is not affecting Tomcat performance (more tips can be found <a href=\"https:\/\/medium.com\/@pawilon\/tuning-your-linux-kernel-and-haproxy-instance-for-high-loads-1a2105ea553e\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">here<\/a>). Likewise, TCP settings at the operating system level also have to be tuned to ensure that a burst of connection requests can be handled at the operating system level. TCP port exhaustion issues also have to be avoided. If the Tomcat server is to be deployed on a Microsoft Windows server, changes to Windows registry settings may be required. See this <a href=\"https:\/\/docs.microsoft.com\/en-us\/biztalk\/technical-guides\/settings-that-can-be-modified-to-improve-network-performance\" rel=\"nofollow\">article<\/a> for a list of registry changes recommended.<\/li>\n<\/ul>\n<h2 class=\"h3_head_style\"><span class=\"ez-toc-section\" id=\"Tuning_Tomcats_JVM\"><\/span>Tuning Tomcat\u2019s JVM<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Since Tomcat uses a <a href=\"https:\/\/www.eginnovations.com\/glossary\/jvm\">JVM<\/a>, the performance of the JVM impacts Tomcat\u2019s performance as well.<\/p>\n<ul class=\"tomcat_list_style\">\n<li>Before you start adjusting any settings, you should make sure that you have chosen a modern JVM for your application. There are many benchmarks that indicate 5-20% performance gains from each version of Java (refer to this <a href=\"https:\/\/www.optaplanner.org\/blog\/2019\/01\/17\/HowMuchFasterIsJava11.html\" rel=\"nofollow\">article<\/a> for more details).<\/li>\n<li><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-10422\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-jvm-tuning.png\" alt=\"The performance of the JVM impacts Tomcat's performance\" width=\"200\" height=\"97\" border=\"0\" srcset=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-jvm-tuning.png 200w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-jvm-tuning-140x68.png 140w\" sizes=\"auto, (max-width: 200px) 100vw, 200px\" \/>Many JVMs are available in 32-bit and 64-bit modes. While the 32-bit mode is limited to 2GB of memory, 64-bit JVMs allow for the Java heap to be set much higher. Hence, make sure you are using a 64-bit JVM for best performance and highest scalability.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/www.eginnovations.com\/blog\/what-is-garbage-collection-java\/\/\">Garbage collection\u00a0<\/a>is the process by which Java programs perform automatic memory management.\u00a0In the past, garbage collection was done in a stop-the-world manner. That is, when garbage collection happened, the application was paused in order to reclaim memory. Today, there are many garbage collection implementations where the garbage collection happens in parallel with the application execution.<\/p>\n<ul class=\"tomcat_list_style\">\n<li>For best performance, make sure that you choose a modern garbage collector like <a href=\"https:\/\/docs.oracle.com\/javase\/9\/gctuning\/garbage-first-garbage-collector.htm\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">G1GC<\/a> (Garbage First Garbage Collector) or the <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/13\/gctuning\/available-collectors.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Z Garbage Collector<\/a>.<\/li>\n<li>The MaxGCPauseMillis setting for the JVM can be used to set the peak pause time expected in the environment. It is recommended that this value be between 500-2000ms for best performance. While longer pauses increase throughput, shorter pauses reduce the latency and the throughput<em><strong>. <\/strong><\/em>In addition to the different GC settings, monitor the Tomcat server in production and make sure that the percentage of time that the JVM spends on garbage collection is low. Any value over 5% will be detrimental to Tomcat\u2019s performance.<\/li>\n<\/ul>\n<p>Memory availability in the JVM can also adversely impact <a href=\"https:\/\/www.eginnovations.com\/supported-technologies\/tomcat-monitoring\">Tomcat performance.<\/a><\/p>\n<ul class=\"tomcat_list_style\">\n<li>You have to make sure that sufficient memory is available in all the heap and non-heap memory pools. If any of the memory pools is running out of available memory, you will encounter OutOfMemory exceptions and the application can fail in unexpected ways. Use the Xmx and Xms flags of the JVM to set the maximum heap size and stack size, and the XX flags to set the PermSize or MetaspaceSize depending on the version of the JRE being used (read this <a href=\"https:\/\/dzone.com\/articles\/permgen-and-metaspace\">article<\/a> for additional reference).<\/li>\n<\/ul>\n<p><a href=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/jvm-memory-pools.png\" data-rel=\"lightbox-image-0\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-sdw-lay-b wp-image-10407\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/jvm-memory-pools.png\" alt=\"Ensure that there is suffient memory available to each JVM memory pool.\" width=\"560\" height=\"376\" border=\"0\" srcset=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/jvm-memory-pools.png 560w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/jvm-memory-pools-300x201.png 300w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/jvm-memory-pools-310x208.png 310w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/jvm-memory-pools-140x94.png 140w\" sizes=\"auto, (max-width: 560px) 100vw, 560px\" \/><\/a><\/p>\n<div class=\"img_caption\" style=\"margin-top: 20px !important;\">Make sure that the memory available to each of the memory pools of the JVM is sufficient. Memory shortage will adversely affect Tomcat server performance.<\/div>\n<ul class=\"tomcat_list_style\">\n<li>Setting the memory limits is often a trial and error process. Setting the memory limits to be too low can result in exceptions, while setting them to be too high can result in waste of resources. Use a <a href=\"https:\/\/www.eginnovations.com\/supported-technologies\/jvm-monitoring\">JVM monitoring tool<\/a> and analyze performance during a week or more, considering peak hours as well to determine optimal values of the JVM memory pools.<\/li>\n<\/ul>\n<p>If memory grows unbounded in the JVM, you will need to determine if there is a memory leak in the application.<\/p>\n<ul class=\"tomcat_list_style\">\n<li>Take a memory heap dump using Java built-in tools such as JvisualVM and Jconsole. Use tools such as the Eclipse Memory Analyzer (MAT) to determine memory leak suspects. The Dominator Tree of MAT will help you narrow down with threads\/objects are causing the memory leak.<\/li>\n<\/ul>\n<p>Finally, track thread activity in the JVM.<\/p>\n<ul class=\"tomcat_list_style\">\n<li>Whereas total threads in the JVM must be tracked to discover any thread leaks, it is important to track <a href=\"https:\/\/www.eginnovations.com\/blog\/troubleshooting-java-application-deadlocks-diagnosing-application-hang-situations\/\">thread blocks and deadlocks<\/a> as they are detrimental to performance. Stack trace of blocking threads and deadlocked threads can reveal application code-level issues.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-application-hangs.png\" data-rel=\"lightbox-image-1\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img decoding=\"async\" class=\"aligncenter wp-image-10408 size-sdw-lay-b\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-application-hangs.png\" alt=\"Managers need to quickly identify thread blocks and deadlocks that cause application hangs.\" width=\"750\" border=\"0\" srcset=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-application-hangs.png 1198w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-application-hangs-300x173.png 300w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-application-hangs-1024x590.png 1024w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-application-hangs-800x461.png 800w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-application-hangs-310x179.png 310w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-application-hangs-140x81.png 140w\" sizes=\"(max-width: 1198px) 100vw, 1198px\" \/><\/a><\/p>\n<div class=\"img_caption\" style=\"margin-top: 0px !important;\">Figure 3: Screenshot from <a style=\"font-size: 14px; font-style: italic;\" href=\"https:\/\/www.eginnovations.com\/supported-technologies\/jvm-monitoring\">eG Enterprise<\/a> which has identified thread blocks and deadlocks causing application hangs<\/div>\n<ul class=\"tomcat_list_style\">\n<li>In addition, monitor the CPU usage of individual threads to detect run-away threads that are taking CPU, slowing down Tomcat. Again, any JVM level monitoring tool can provide these insights.<\/li>\n<li>In some cases, background threads of an application may be taking excessive resources. By <a href=\"https:\/\/www.eginnovations.com\/blog\/java-threads\/\">monitoring thread activity<\/a>, you can determine such scenarios and even determine the line of code\/method that is causing the problem.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/www.eginnovations.com\/supported-technologies\/java-application-monitoring?utm_source=blog&amp;utm_medium=banner&amp;utm_campaign=tomcat_performance&amp;utm_content=java_monitoring\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11323\" style=\"margin: 15px auto;\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/Tomcat-java.jpg\" alt=\"Tomcat-java\" width=\"640\" height=\"120\" border=\"0\" srcset=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/Tomcat-java.jpg 640w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/Tomcat-java-300x56.jpg 300w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/Tomcat-java-310x58.jpg 310w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/Tomcat-java-140x26.jpg 140w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/a><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Tuning_the_Tomcat_container\"><\/span>Tuning the Tomcat container<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><a href=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tuning-tomcat-container.png\" data-rel=\"lightbox-image-2\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-sdw-lay-b wp-image-10421\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tuning-tomcat-container-310x191.png\" alt=\"Tomcat's server.xml configuration includes several adjustable elements to improve Tomcat performance\" width=\"310\" height=\"191\" border=\"0\" srcset=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tuning-tomcat-container-310x191.png 310w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tuning-tomcat-container-300x185.png 300w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tuning-tomcat-container-800x492.png 800w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tuning-tomcat-container-140x86.png 140w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tuning-tomcat-container.png 850w\" sizes=\"auto, (max-width: 310px) 100vw, 310px\" \/><\/a>As is the case with the JVM, many scalability and security enhancements have been made with the latest releases. Hence, make sure that you are using the latest version of Tomcat. Currently, Tomcat 9 is the latest version.<\/p>\n<p>Tomcat&#8217;s server.xml configuration file includes several elements that can be tweaked to enhance the performance of Tomcat.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Configuring_the_connectors\"><\/span><strong class=\"sub_head_str\">Configuring the connectors<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-10420\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-requests.png\" alt=\"Multiple Tomcat connectors manage multiple workloads.\" width=\"100\" height=\"100\" border=\"0\" \/>These are elements that enable Tomcat to receive requests from clients. One instance of a connector listens for requests on a specific TCP port number on a server.<\/p>\n<ul>\n<li>If there are different types of workloads coming into your Tomcat server, <strong>you should consider having multiple connectors<\/strong> \u2013 so one type of traffic is processed on one port and a second type on another port. Doing so reduces the changes that the different types of workloads may interfere with one another.<\/li>\n<\/ul>\n<p>Each incoming request is processed by a thread in Tomcat. The maxThreads attribute of a connector defines the maximum number of simultaneous threads that can be executing for a connector. The number of simultaneous threads executing depends on the hardware and the number of CPUs it has. The better the hardware and higher the number of processors, the greater the concurrency that Tomcat will need to support.<\/p>\n<ul class=\"tomcat_list_style\">\n<li>If the maxThreads attribute is set too low, requests will need to wait until a thread becomes available to process the request. This can increase response times seen by users. Hence, <strong>for best performance, set maxThreads to a high enough value<\/strong> that threads are always available in Tomcat to process incoming requests.<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-sdw-lay-b wp-image-10409\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-attribute-connectors.jpg\" alt=\"Tomcat connectors manage maxThreads attributes and more.\" width=\"400\" height=\"190\" border=\"0\" srcset=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-attribute-connectors.jpg 400w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-attribute-connectors-300x143.jpg 300w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-attribute-connectors-310x147.jpg 310w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-attribute-connectors-140x67.jpg 140w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/p>\n<div class=\"img_caption\" style=\"margin-top: 0px !important;\">Attributes of a Tomcat connector<\/div>\n<p>From a monitoring standpoint, it is important to monitor the number of threads active in each connector\u2019s thread pool. If the number of active threads is close to the maxThreads limit, you should consider tuning the Tomcat server configuration to allow for a larger thread pool for the connector.<\/p>\n<p>The choice of the connector protocol to handle incoming requests also affects the Tomcat server\u2019s throughput. For example, Tomcat 9 supports blocking and non-blocking connectors. See this <a href=\"https:\/\/tomcat.apache.org\/tomcat-9.0-doc\/config\/http.html#Connector_Comparison\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">comparison chart<\/a>.<\/p>\n<p>With a blocking connector where each worker thread is consumed until its associated connection is complete. However, a non-blocking connector leads to better thread management with longer running requests. Performance tests suggest that the non-blocking connector provides better performance with longer running requests.<\/p>\n<ul class=\"tomcat_list_style\">\n<li><strong>Consider using non-blocking connectors<\/strong> as this delivers greater performance.<\/li>\n<\/ul>\n<p>The enableLookups setting for a connector determines if the Tomcat server performs a DNS reverse lookup to find the hostname of each remote client.<\/p>\n<ul class=\"tomcat_list_style\">\n<li>DNS lookups are expensive and if this value is set to true, a slowdown of the DNS service can make it appear as if Tomcat is slow. Therefore, <strong>for best performance, turn enableLookups<\/strong> to false for all the connectors in use.<\/li>\n<\/ul>\n<p>Another important connector setting is the acceptCount. This is the max length of the accept queue where requests are placed while waiting for a processing thread. When the accept queue is full, additional incoming requests will be refused. <strong>The default value of 100 is inadequate for typical production workloads<\/strong>.<\/p>\n<ul class=\"tomcat_list_style\">\n<li><strong>For best performance, set the acceptCount to be large<\/strong> enough to accommodate the burst of incoming connections that the server can receive. If the acceptCount is too low, clients will see \u201cconnection refused\u201d errors. If the value is too high, the queue will take up additional server memory.<\/li>\n<\/ul>\n<p>When using the NIO and NIO2 connectors, you can configure the size of the socket read buffers and write buffers used by Tomcat. The socket.rxBufSize and socket.txBufSize attributes govern the buffer size setting.<\/p>\n<ul class=\"tomcat_list_style\">\n<li><strong>Larger the value of socket.rxBufSize and socket.txBufSize, higher the throughput supported<\/strong>. Consider settings of 64KB or higher for these values.<\/li>\n<\/ul>\n<p>Often, you may have clients connecting over WAN links to the Tomcat server. The compression attribute controls whether Tomcat compresses content when sending it to clients.<\/p>\n<ul class=\"tomcat_list_style\">\n<li>Set this attribute to \u201con\u201d for best performance. GZIP compression is used then.<\/li>\n<li>The content types that should be compressed is provided in the compressibleMimeType.<\/li>\n<\/ul>\n<p>Any communication between the client and server that is primarily text, be it HTML, XML or simply Unicode, can regularly be compressed up to 90% using a simple and standard GZIP algorithm. This can have a massive impact on reducing network traffic, allowing responses to be sent back to the client much faster, while at the same time allowing for more network bandwidth to be available for other network heavy applications.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Using_executors\"><\/span><strong class=\"sub_head_str\">Using executors<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-10419\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/executors.png\" alt=\"Pools of threads are dedicated to each connector.\" width=\"100\" height=\"100\" border=\"0\" \/>When using connectors, a pool of threads is dedicated to each connector. If you are using multiple connectors, you can configure an executor. An executor is a common thread pool that can be shared by multiple connectors. Not only does this allow better sharing of threads across connectors, but it also provides a mechanism to lower the number of threads in the pool should the incoming workload not require these threads for processing.<\/p>\n<p>When using a thread pool per connector, Tomcat does not reclaim threads in the pool, so if you see a large spurt of requests once, this can increase the number of threads in the pool for the entire lifetime of the Tomcat server. When using an executor, the maxThreads setting is defined at the executor level. In such a case, Tomcat administrators need to monitor the thread pool activity and usage at the executor level, not at the connector level.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Configuring_public_SSL_certificates\"><\/span><strong class=\"sub_head_str\">Configuring public SSL certificates<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul class=\"tomcat_list_style\">\n<li><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-10418\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/configuring-ssl-certificates.png\" alt=\"\" width=\"100\" height=\"100\" border=\"0\" \/>If your connector is SSL enabled, make sure that you have configured it with a valid SSL public certificate.<\/li>\n<\/ul>\n<p>Check this blog to understand the <a href=\"https:\/\/www.eginnovations.com\/blog\/troubleshooting-web-application-performance\/\">performance impact that improper SSL certificate configuration can have on Tomcat performance<\/a>.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Tune_resource_caching_settings\"><\/span><strong class=\"sub_head_str\">Tune resource caching settings<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-10417\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/resource-cache-settings.png\" alt=\"Tomcat resource cache settings\" width=\"100\" height=\"100\" border=\"0\" \/>To improve performance, Tomcat is configured by default to cache static resources. However, the size of the cache must be configured to be large enough to provide performance savings.<\/p>\n<ul class=\"tomcat_list_style\">\n<li>To tune Tomcat\u2019s cache settings, find the Context directive (in server.xml or context.xml), and set the cacheMaxSize attribute to the appropriate value.<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"Database_connection_pooling\"><\/span><strong class=\"sub_head_str\">Database connection pooling<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-10416\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/database-connection-pooling.png\" alt=\"Database Connection Pooling\" width=\"100\" height=\"100\" border=\"0\" \/>Connection opens to the database are expensive. Connection pooling is a common technique for optimizing database accesses by having a pool of open connections so that requests can take connections from the pool and return connections back to the pool once they are done with their tasks. By not having to create and tear down connections for each request, connection pooling allows application response to be faster and reduces the overhead of connection handling on the database server. Tomcat has built-in support for database connection pooling.<\/p>\n<ul class=\"tomcat_list_style\">\n<li>As in the case of thread pools, ensure that the database connection pool\u2019s maxActive setting, which defines if the maximum number of active connections in the pool is large enough to accommodate the workload it is handling.<\/li>\n<li>Monitor the database connection pool usage because if the connection pool is fully utilized, new requests will wait for free connections to be available, causing response times to go up.<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"Webxml_optimizations\"><\/span><strong class=\"sub_head_str\">Web.xml optimizations<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-10415\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/web-xml-optimization.png\" alt=\"Web.xml Optimization\" width=\"100\" height=\"100\" border=\"0\" \/>The server.xml file is used to specify server-specific configurations. There is only one server.xml for each Tomcat server instance. The web.xml file is used to specify the web application specific configurations. There is one web.xml file for each web application deployed on the Tomcat server. The default settings inherited by all web applications are defined by a web.xml file in the main Tomcat configuration directory.<\/p>\n<ul class=\"tomcat_list_style\">\n<li>The default property values in this file are tuned for development environments and need to be modified for production deployments. The Java Server Pages (JSP) compiler setting has a development mode setting. This is true by default. Change this to false to avoid checking JSPs often to see if recompilation is necessary.<\/li>\n<li>Precompile JSPs to avoid compilation overhead on production servers.<\/li>\n<li>Likewise, set genStringAsCharArray to \u201ctrue\u201d to produce more efficient char arrays.<\/li>\n<li>Set trimSpaces to \u201ctrue\u201d to remove unnecessary bytes from the response.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/www.eginnovations.com\/blog\/top-10-java-performance-problems\/?utm_source=blog&amp;utm_medium=banner&amp;utm_campaign=tomcat_performance&amp;utm_content=java_problems\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11323\" style=\"margin: 15px auto;\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/Tomcat-java-bottom.jpg\" alt=\"Tomcat-java\" width=\"640\" height=\"120\" border=\"0\" \/><\/a><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Tuning_the_application_code_for_high_performance\"><\/span>Tuning the application code for high performance<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Inefficient application code can also cause the application deployed on Tomcat to be slow. Logging is a common way to track an application\u2019s operation. However, logging to output files is a synchronized operation and excessive logging can actually slow down application performance.<\/p>\n<p>Employ <a href=\"https:\/\/www.eginnovations.com\/glossary\/distributed-tracing\">transaction tracing<\/a> techniques that are based on <a href=\"https:\/\/www.eginnovations.com\/blog\/distributed-transaction-tracing\/\">byte-code instrumentation<\/a> to monitor application processing without needing any changes to the application code. These techniques rely on a specially crafted jar file that utilizes the\u00a0<a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/instrument\/Instrumentation.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">instrumentation API<\/a>\u00a0that the JVM provides to alter existing byte-code that is loaded in a JVM.<\/p>\n<p>IT teams and developers can use this capability to drill down into <a href=\"https:\/\/www.eginnovations.com\/supported-technologies\/java-transaction-monitoring\">slow transactions<\/a> and proactively detect performance problems before they impact end-users.<\/p>\n<p><a href=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-distributed-transaction-tracing.png\" data-rel=\"lightbox-image-3\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img decoding=\"async\" class=\"aligncenter wp-image-10410 size-sdw-lay-b\" style=\"max-width: 750px; border: 1px solid #ddd;\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-distributed-transaction-tracing.png\" alt=\"Distributed transacton tracing is used to identify code-level issues in web applications powered by Tomcat.\" width=\"750\" border=\"0\" srcset=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-distributed-transaction-tracing.png 1087w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-distributed-transaction-tracing-300x177.png 300w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-distributed-transaction-tracing-1024x605.png 1024w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-distributed-transaction-tracing-800x472.png 800w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-distributed-transaction-tracing-310x183.png 310w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tomcat-distributed-transaction-tracing-140x83.png 140w\" sizes=\"(max-width: 1087px) 100vw, 1087px\" \/><\/a><\/p>\n<div class=\"img_caption\" style=\"margin-top: 0px !important;\">Figure 4: Screenshot from <a style=\"font-size: 14px; font-style: italic;\" href=\"https:\/\/www.eginnovations.com\/supported-technologies\/java-application-monitoring\">eG Enterprise<\/a> showing how distributed transaction tracing is used to identify code-level issues in web applications powered by Tomcat.<\/div>\n<p><a href=\"https:\/\/www.eginnovations.com\/product\/application-performance-monitoring?utm_source=blog&amp;utm_medium=banner&amp;utm_campaign=tomcat_performance&amp;utm_content=apm\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11323\" style=\"margin-bottom: 20px;\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/Tomcat-java-3.jpg\" alt=\"Tomcat-java\" width=\"640\" height=\"120\" border=\"0\" \/><\/a><\/p>\n<div class=\"containers mb-4\" style=\"clear:both\">\n \t<div class=\"fixed-free-trial-div mb-3\" id=\"fixedsectioninfo_blog_btn\">\n \t\n \t<style>.containers_hide_row,.all_blogs_bottom{\n \tdisplay:none;\n   \n}\t<\/style>\n                <div class=\"box-style container row pt-4 pb-4  animatedParent animateOnce\" data-sequence=\"100\" style=\"border-bottom: 1px solid #ddd;border-top: 1px solid #ddd;background: #4b4b4b;padding: 15px 15px 0 15px;border-radius: 12px;\">\n                \n                <div class=\"text-center animated fadeIn go\"> \n                <p class=\"text-center mb-4\" style=\"    color: #fff;\">\n\neG Enterprise is an Observability solution for Modern IT. Monitor digital workspaces, <br\/>web applications, SaaS services, cloud and containers from a single pane of glass.\n<\/p>\n                <\/div>\n                    <div class=\"text-center pb-1 animated fadeIn go\" data-id=\"8\">\n                        <a class=\"border-btnhead-eg\"  href=\"https:\/\/www.eginnovations.com\/it-monitoring\/free-trial\"> <span style=\"font-family: GraphikMedium!important;color: #fff;\">Free Trial<\/span><\/a>\n                        <a href=\"https:\/\/www.eginnovations.com\/product\/application-performance-monitoring\" class=\" border-btnhead-eg\" style=\"width:230px;   \"> <svg width=\"24\" height=\"24\" style=\"margin-top:-3px\" version=\"1.1\" id=\"Layer_1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" x=\"0px\" y=\"0px\"\n\t viewBox=\"0 0 26.5 26.5\" style=\"enable-background:new 0 0 26.5 26.5;\" xml:space=\"preserve\">\n<style type=\"text\/css\">\n\t.st2{fill:#fff !important;stroke:#fff !important;stroke-miterlimit:10;}\n\t\n\t\t.border-btnhead:hover .st2 {\n  fill: #ffffff !important;\n  stroke: #ffffff;\n}\n<\/style>\n<g>\n\t<g>\n\t\t<path class=\"st2\" d=\"M13.3,25.8c-6.9,0-12.5-5.6-12.5-12.5S6.4,0.8,13.3,0.8s12.5,5.6,12.5,12.5S20.2,25.8,13.3,25.8z M13.3,1.8\n\t\t\tC6.9,1.8,1.8,6.9,1.8,13.3S7,24.8,13.3,24.8s11.5-5.2,11.5-11.5S19.6,1.8,13.3,1.8z M11.2,18.1c-0.2,0-0.4-0.1-0.6-0.2\n\t\t\tc-0.3-0.2-0.6-0.6-0.6-1V9.7c0-0.4,0.2-0.8,0.6-1c0.3-0.2,0.8-0.2,1.2,0l6.2,3.6c0.3,0.2,0.6,0.6,0.6,1s-0.2,0.8-0.6,1l-6.2,3.6\n\t\t\tC11.6,18,11.4,18.1,11.2,18.1z\"\/>\n\t<\/g>\n<\/g>\n<\/svg> <span style=\"font-family: GraphikMedium!important;color: #fff;\">&nbsp;See the platform<\/span><\/a>\n                    <\/div>\n                <\/div>\n                \n                 <\/div>\n            <\/div>\n<h2><span class=\"ez-toc-section\" id=\"Conclusion\"><\/span>Conclusion<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>You may often hear that application servers based on Java, such as Tomcat, are slow or not production ready. In this blog, we have provided a range of best practice configurations to get the most out of your Tomcat web application server. Our eG Enterprise <a href=\"https:\/\/www.eginnovations.com\/product\/application-performance-monitoring\">application performance monitoring<\/a> solution uses <a href=\"https:\/\/www.eginnovations.com\/supported-technologies\/apache-monitoring\">Apache<\/a> Tomcat as the core container engine and has been widely deployed to support monitoring of tens of thousands of servers, tens of millions of real-time metrics, and over a hundred thousand end users in production. So, you can be sure that the best practices we have provided here actually work!<\/p>\n<div class=\"frm-cta\"><a class=\"frm-cta-link\" href=\"https:\/\/www.eginnovations.com\/product\/application-performance-monitoring\/free-trial\"><strong>Try eG Enterprise in Your Tomcat Environment Today<\/strong><\/a><\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Get maximum performance from Apache Tomcat A question we often get asked by customers is: what Tomcat performance tuning can they do to improve the overall performance. This guide is everything we know about tuning Apache Tomcat for maximum performance. Apache Tomcat, developed by the Apache Software Foundation, is an open source Java servlet container [&hellip;]<\/p>\n","protected":false},"author":20,"featured_media":10392,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"_lmt_disableupdate":"no","_lmt_disable":"","footnotes":""},"categories":[371,27],"tags":[465,171,435,176,463,689,464,466],"class_list":["post-10391","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-performance-monitoring-apm","category-java-monitoring","tag-apache-tomcat","tag-java","tag-java-apm","tag-java-monitoring","tag-tomcat","tag-tomcat-apm","tag-tomcat-monitoring","tag-tomcat-tuning"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>10 Apache Tomcat Performance Tuning Tips and Best Practices<\/title>\n<meta name=\"description\" content=\"Learn tips and tricks to troubleshoot, tune and optimize Tomcat for maximum performance and eliminate Tomcat issues.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.eginnovations.com\/blog\/tomcat-performance-tuning\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tomcat Tuning Tips and Best Practices | eG Innovations\" \/>\n<meta property=\"og:description\" content=\"Got problems with the performance of your Tomcat Server? Read this blog to learn tips, tricks, and best practice to tune and optimize Tomcat for maximum output.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.eginnovations.com\/blog\/tomcat-performance-tuning\/\" \/>\n<meta property=\"og:site_name\" content=\"eG Innovations\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/eGInnovations\" \/>\n<meta property=\"article:published_time\" content=\"2019-12-27T12:30:48+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-12-10T10:05:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tuning-tomcat.jpg\" \/>\n<meta name=\"author\" content=\"Keren Emil\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"Tomcat Tuning Tips and Best Practices | eG Innovations\" \/>\n<meta name=\"twitter:description\" content=\"Got problems with the performance of your Tomcat Server? Read this blog to learn tips, tricks, and best practice to tune and optimize Tomcat for maximum output.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tuning-tomcat.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@eginnovations\" \/>\n<meta name=\"twitter:site\" content=\"@eginnovations\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Keren Emil\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 minutes\" \/>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"10 Apache Tomcat Performance Tuning Tips and Best Practices","description":"Learn tips and tricks to troubleshoot, tune and optimize Tomcat for maximum performance and eliminate Tomcat issues.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.eginnovations.com\/blog\/tomcat-performance-tuning\/","og_locale":"en_US","og_type":"article","og_title":"Tomcat Tuning Tips and Best Practices | eG Innovations","og_description":"Got problems with the performance of your Tomcat Server? Read this blog to learn tips, tricks, and best practice to tune and optimize Tomcat for maximum output.","og_url":"https:\/\/www.eginnovations.com\/blog\/tomcat-performance-tuning\/","og_site_name":"eG Innovations","article_publisher":"https:\/\/www.facebook.com\/eGInnovations","article_published_time":"2019-12-27T12:30:48+00:00","article_modified_time":"2024-12-10T10:05:11+00:00","og_image":[{"url":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tuning-tomcat.jpg","type":"","width":"","height":""}],"author":"Keren Emil","twitter_card":"summary_large_image","twitter_title":"Tomcat Tuning Tips and Best Practices | eG Innovations","twitter_description":"Got problems with the performance of your Tomcat Server? Read this blog to learn tips, tricks, and best practice to tune and optimize Tomcat for maximum output.","twitter_image":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tuning-tomcat.jpg","twitter_creator":"@eginnovations","twitter_site":"@eginnovations","twitter_misc":{"Written by":"Keren Emil","Est. reading time":"17 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.eginnovations.com\/blog\/tomcat-performance-tuning\/#article","isPartOf":{"@id":"https:\/\/www.eginnovations.com\/blog\/tomcat-performance-tuning\/"},"author":{"name":"Keren Emil","@id":"https:\/\/www.eginnovations.com\/blog\/#\/schema\/person\/6e6a6382a7491a6c5da334e912adb508"},"headline":"10 Tips for Apache Tomcat performance tuning","datePublished":"2019-12-27T12:30:48+00:00","dateModified":"2024-12-10T10:05:11+00:00","mainEntityOfPage":{"@id":"https:\/\/www.eginnovations.com\/blog\/tomcat-performance-tuning\/"},"wordCount":2805,"commentCount":0,"publisher":{"@id":"https:\/\/www.eginnovations.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.eginnovations.com\/blog\/tomcat-performance-tuning\/#primaryimage"},"thumbnailUrl":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tuning-apache.jpg","keywords":["Apache Tomcat","Java","Java APM","Java Monitoring","Tomcat","Tomcat APM","Tomcat monitoring","Tomcat tuning"],"articleSection":["Application Performance Monitoring (APM)","Java Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.eginnovations.com\/blog\/tomcat-performance-tuning\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.eginnovations.com\/blog\/tomcat-performance-tuning\/","url":"https:\/\/www.eginnovations.com\/blog\/tomcat-performance-tuning\/","name":"10 Apache Tomcat Performance Tuning Tips and Best Practices","isPartOf":{"@id":"https:\/\/www.eginnovations.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.eginnovations.com\/blog\/tomcat-performance-tuning\/#primaryimage"},"image":{"@id":"https:\/\/www.eginnovations.com\/blog\/tomcat-performance-tuning\/#primaryimage"},"thumbnailUrl":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tuning-apache.jpg","datePublished":"2019-12-27T12:30:48+00:00","dateModified":"2024-12-10T10:05:11+00:00","description":"Learn tips and tricks to troubleshoot, tune and optimize Tomcat for maximum performance and eliminate Tomcat issues.","breadcrumb":{"@id":"https:\/\/www.eginnovations.com\/blog\/tomcat-performance-tuning\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.eginnovations.com\/blog\/tomcat-performance-tuning\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.eginnovations.com\/blog\/tomcat-performance-tuning\/#primaryimage","url":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tuning-apache.jpg","contentUrl":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2019\/12\/tuning-apache.jpg","width":300,"height":200},{"@type":"BreadcrumbList","@id":"https:\/\/www.eginnovations.com\/blog\/tomcat-performance-tuning\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.eginnovations.com\/blog\/"},{"@type":"ListItem","position":2,"name":"10 Tips for Apache Tomcat performance tuning"}]},{"@type":"WebSite","@id":"https:\/\/www.eginnovations.com\/blog\/#website","url":"https:\/\/www.eginnovations.com\/blog\/","name":"eG Innovations","description":"IT Performance Monitoring Insights","publisher":{"@id":"https:\/\/www.eginnovations.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.eginnovations.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.eginnovations.com\/blog\/#organization","name":"eG Innovations","alternateName":"eg innovations","url":"https:\/\/www.eginnovations.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.eginnovations.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2014\/07\/eg-logo-dark-gray1_new.jpg","contentUrl":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2014\/07\/eg-logo-dark-gray1_new.jpg","width":362,"height":235,"caption":"eG Innovations"},"image":{"@id":"https:\/\/www.eginnovations.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/eGInnovations","https:\/\/x.com\/eginnovations"]},{"@type":"Person","@id":"https:\/\/www.eginnovations.com\/blog\/#\/schema\/person\/6e6a6382a7491a6c5da334e912adb508","name":"Keren Emil","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.eginnovations.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/1d5e57d310e83b565706d96dd2cac1cd?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1d5e57d310e83b565706d96dd2cac1cd?s=96&d=mm&r=g","caption":"Keren Emil"},"sameAs":["eguser"],"url":"https:\/\/www.eginnovations.com\/blog\/author\/keren\/"}]}},"modified_by":"Review eG","_links":{"self":[{"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/posts\/10391","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/users\/20"}],"replies":[{"embeddable":true,"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/comments?post=10391"}],"version-history":[{"count":0,"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/posts\/10391\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/media\/10392"}],"wp:attachment":[{"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/media?parent=10391"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/categories?post=10391"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/tags?post=10391"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}