ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Tomcat性能优化

2026/8/28 20:17:04 拓冰建站 浏览量
Tomcat性能优化 Tomcat性能优化一、操作系统调优对于操作系统优化来说是尽可能的增大可使用的内存容量、提高CPU的频率保证文件系统的读写速率等。经过压力测试验证在并发连接很多的情况下CPU的处理能力越强系统运行速度越快。【适用场景】任何项目。二、Java虚拟机调优应该选择SUN的JVM在满足项目需要的前提下尽量选用版本较高的JVM一般来说高版本产品在速度和效率上比低版本会有改进。JDK1.4比JDK1.3性能提高了近10%-20%JDK1.5比JDK1.4性能提高25%-75%。因此对性能要求较高的情况推荐使用 JDK1.6。【适用场景】任何项目。三、Apache集成TomcatWeb服务器专门处理HTTP请求应用服务器是通过很多协议为应用提供商业逻辑。虽然Tomcat也可以作web服务器但其处理静态html的速度比不上Apache且其作为web服务器的功能远不如Apache因此把Apache和Tomcat集成起来将html和Jsp的功能部分进行明确分工让Tomcat只处理Jsp部分其他的由ApacheIIS等web服务器去处理由此大大提高Tomcat的运行效率。如果一个项目中大量使用了静态页面、大量的图片等并有有较大的访问量推荐使用Apache集成Tomcat的方式来提高系统的整体性能。Apache和Tomcat的整合有三种方式分别是JK、http_proxy和ajp_proxy.其中JK方式是最常见的方式JK本身有两个版本分别是1和2目前1最新版本是1.2.8而版本2早已经废弃了。http_proxy是利用Apache自带的mod_proxy模块使用代理技术来连接Tomcat。Ajp_proxy连接方式其实跟http_proxy方式一样都是由mod_proxy所提供的功能。只需要把配置中的 http://换成ajp://,同时连接的是Tomcat的AJP Connector所在的端口。相对于JK的连接方式后两种在配置上比较简单的灵活性方面也一点都不逊色。但就稳定性而言不像JK这样久经考验所以建议采用JK的连接方式。ApacheJKTomcat配置使用到的两个配置文件分别是httpd.conf和mod_jk.conf。其中httpd.conf是Apache服务器的配置文件用来加载JK模块以及指定JK配置文件信息。mod_jk.conf是到Tomcat服务器的连接定义文件。【部署步骤】1.安装Apache服务器2.部署Tomcat3.将mod_jk.so拷贝到modules目录下面4.修改httpd.conf和mod_jk.conf【适用场景】大量使用静态页面的应用系统。注此处建议使用nginx集成tomcat因为本文的内容来自于网络上七零八落的拼接很多东西都比较老了。nginx在处理静态页面上的能力比apache还要强而jsp动态页面的处理可以通过http_proxy交给tomat来处理。四、Apache和Tomcat集群对于并发要求很高的系统我们需要采取负载均衡的方式来分担Tomcat服务器的压力。负载均衡实现大概有四种第一是通过DNS但只能简单的实现轮流分配不能处理故障第二是基于MS IIS,windows 2003 server本身就带了负载均衡服务第三是硬件方式通过交换机功能或专门的负载均衡设备来实现第四种是软件的方式通过一台负载均衡服务器进行上面安装软件。使用Apache Httpd Server做负载均衡器Tomcat集群节点使用Tomcat就可以做到上述第四种方式这种方式比较灵活成本相对比较低另外一个很大的优点就是可以根据应用情况和服务器的情况做一些灵活的配置。所以推荐使用ApacheTomcat集群来实现负载均衡。采用Tomcat集群可以最大程度的发挥服务器的性能可以在配置较高的服务器上部署多个Tomcat也可以在多台服务器上分别部署 TomcatApache和Tomcat整合的方式还是JK方式。经过验证系统对大用户量使用的响应方面Apache3Tomccat集群 Apache2Tomcat集群 Apache集成Tomcat 单个Tomcat。并且采用Apache多Tomcat集群的部署方式时如果一个Tomcat出现宕机系统可以继续使用所以在硬件系统性能足够优越的情况下需要尽量发挥软件的性能可以采用增加Tomcat集群的方式。ApacheTomcat集群的方式使用到得配置文件有httpd.conf、mod_jk.conf、workers.properties。其中 mod_jk.conf是对JK信息的配置包括JK的路径等workers.properties配置文件是对Tomcat服务器的连接定义文件。Apache需要调整运行参数这样才能构建一个适合相应网络环境的web服务。其中可进行的优化配置如下1. 设置MPMMulti Processing Modules多道处理模块。ThreadPerChild,这个参数用于设置每个进程的线程数在Windows环境下默认值是64最大值是 1920建议设置为100-500之间服务器性能高的话值大一些反之小一些。MaxRequestPerChild表示每个子进程能够处理的最大请求数。这个参数的值更大程度上取决于服务器的内存如果内存比较大的话可以设置为很大的参数否则设置一个较小的值建议值是3000.2. 关闭DNS和名字解析 HostnameLookups off3. 打开UseCanonicalName模块 UseCanonicalName on4. 关闭多余模块 一般来说不需要加载的模块有mod_include.so、mod_autoindex.so、mod_access.so、mod_auth.so.5. 打开KeepAlive支持KeepAlive on, KeepAliveTimeout 15 MaxKeepAliveRequests 1000根据实际经验通过Apache和Tomcat集群的方式提高系统性能的效果十分明显这种方式可以最大化的利用硬件资源通过多个Tomcat的处理来分担单Tomcat时的压力。【部署步骤】1.安装Apache服务器2.部署Tomcat集群即多个相同的Tomcat。3.将mod_jk.so拷贝到modules目录下面4.修改httpd.conf、mod_jk.conf和workers.properties【适用场景】并发用户量及在线使用用户数量比较高的系统。注此处也建议使用nginxkeepalived做为高性能和高可用性方案。五、Tomcat自身优化1. JVM参数调优-Xmssize 表示JVM初始化堆的大小-Xmxsize表示JVM堆的最大值。这两个值的大小一般根据需要进行设置。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%。在catalina.bat中设置 JAVA_OPTS-Xms256m -Xmx512m表示初始化内存为256MB可以使用的最大内存为512MB。tomcat 的jvm建议调整到1024M 即在tomcat/bin/catalina.bat文件头部添加set JAVA_OPTS-Xms512m -Xmx1024m生产环境调优案例下面以一个实际电商订单系统的生产环境为例说明JVM参数调优的完整过程与效果。服务器配置CPU8核 Intel Xeon E5-2680 v4内存16GB操作系统CentOS 7.664位JDK版本JDK 1.8.0_202Tomcat版本Tomcat 8.5.51部署方式单机单实例前置Nginx做反向代理调优前JVM参数默认配置set JAVA_OPTS-Xms256m -Xmx512m -XX:MaxMetaspaceSize256m调优后JVM参数set JAVA_OPTS-Xms4g -Xmx4g -XX:MaxMetaspaceSize512m -XX:UseG1GC -XX:MaxGCPauseMillis200 -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/data/logs/tomcat_heapdump.hprof参数说明-Xms4g -Xmx4g初始堆与最大堆均设为4GB避免运行时频繁扩容和收缩减少GC压力。根据服务器16GB内存堆占可用内存的约25%为操作系统和元空间预留充足余量。-XX:MaxMetaspaceSize512m元空间上限设为512MB防止类加载过多导致元空间溢出。-XX:UseG1GC采用G1垃圾回收器适合大堆内存场景能更好地控制停顿时间。-XX:MaxGCPauseMillis200目标GC最大停顿时间控制在200毫秒以内。-XX:HeapDumpOnOutOfMemoryError发生内存溢出时自动导出堆转储文件便于事后分析。压力测试方案使用JMeter对订单查询接口进行压测模拟300个并发用户持续运行30分钟记录吞吐量、平均响应时间、GC停顿时间及内存使用情况。调优前后性能对比指标调优前调优后提升幅度吞吐量TPS8201560提升约90%平均响应时间ms365192降低约47%P99响应时间ms890410降低约54%Full GC次数30分钟182减少约89%Full GC平均停顿ms1200180降低约85%内存溢出次数30完全消除调优结论通过合理设置堆内存大小、采用G1垃圾回收器并配置元空间上限系统吞吐量提升约90%平均响应时间降低约47%Full GC次数和停顿时间大幅减少内存溢出问题彻底消除。需要注意的是实际调优时应结合业务特点、服务器硬件和压测数据反复验证切忌盲目套用参数。2. 禁用DNS查询当web应用程序向要记录客户端的信息时它也会记录客户端的IP地址或者通过域名服务器查找机器名转换为IP地址。DNS查询需要占用网络并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的IP的过程这样会消耗一定的时间。为了消除DNS查询对性能的影响我们可以关闭DNS查询方式是修改server.xml文件中的enableLookups参数值Tomcat4Connector classNameorg.apache.coyote.tomcat4.CoyoteConnector port80 minProcessors5 maxProcessors75 enableLookupsfalse redirectPort8443 acceptCount100 debug0 connectionTimeout20000 useURIValidationHackfalse disableUploadTimeouttrue /Tomcat5Connector port80 maxThreads150 minSpareThreads25 maxSpareThreads75 enableLookupsfalse redirectPort8443 acceptCount100 debug0 connectionTimeout20000 disableUploadTimeouttrue/3. 调整线程数通过应用程序的连接器Connector进行性能控制的的参数是创建的处理请求的线程数。Tomcat使用线程池加速响应速度来处理请求。在Java 中线程是程序运行时的路径是在一个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序员写出CPU最大利用率的高效程序使空闲时间保持最低从而接受更多的请求。调整tomcat的server.xml 其中的参数配置例Connector port8080 maxHttpHeaderSize8192 maxThreads150 minSpareThreads25 maxSpareThreads75 enableLookupsfalse redirectPort8443 acceptCount100 connectionTimeout20000 disableUploadTimeouttrue URIEncodingGBK /Connector port8080 maxHttpHeaderSize8192 maxThreads150 minSpareThreads25 maxSpareThreads75 enableLookupsfalse redirectPort8443 acceptCount100 connectionTimeout20000 disableUploadTimeouttrue URIEncodingGBK /将其中的maxThreads”150″ 修改为maxThreads”1500″ 即可以最大承载1500个并发事务。一个用户基本上请求一次服务需要二个线程进行支持一个是request,一个是response。这样IGRP就可以承载最高750个用户的完全并发。maxThreads默认tomcat配置为200个。不要遗漏URIEncoding”GBK”能使页面url传递中文参数时保证正确。Tomcat4中可以通过修改minProcessors和maxProcessors的值来控制线程数。这些值在安装后就已经设定为默认值并且是足够使用的但是随着站点的扩容而改大这些值。minProcessors服务器启动时创建的处理请求的线程数应该足够处理一个小量的负载。也就是说如果一天内每秒仅发生5次单击事件并且每个请求任务处理需要1秒钟那么预先设置线程数为5就足够了。但在你的站点访问量较大时就需要设置更大的线程数指定为参数maxProcessors的值。maxProcessors的值也是有上限的应防止流量不可控制或者恶意的服务攻击从而导致超出了虚拟机使用内存的大小。如果要加大并发连接数应同时加大这两个参数。web server允许的最大连接数还受制于操作系统的内核参数设置通常Windows是2000个左右Linux是1000个左右。在Tomcat5对这些参数进行了调整请看下面属性maxThreads Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。acceptCount 指定当所有可以使用的处理请求的线程数都被使用时可以放到处理队列中的请求数超过这个数的请求将不予处理。connnectionTimeout 网络连接超时单位毫秒。设置为0表示永不超时这样设置有隐患的。通常可设置为30000毫秒。minSpareThreads Tomcat初始化时创建的线程数。maxSpareThreads 一旦创建的线程超过这个值Tomcat就会关闭不再需要的socket线程。最好的方式是多设置几次并且进行测试观察响应时间和内存使用情况。在不同的机器、操作系统或虚拟机组合的情况下可能会不同而且并不是所有人的web站点的流量都是一样的因此没有一刀切的方案来确定线程数的值。六、APR库使用Tomcat中使用APR库其实就是在Tomcat中使用JNI的方式来读取文件以及进行网络传输。可以大大提升Tomcat对静态文件的处理性能同时如果你使用了HTTPS方式传输的话也可以提升SSL的处理性能。一般在Windows下可以直接下载编译好的二进制版本的dll库文件来使Tomcat启用APR一般建议拷贝库文件tcnative-1.dll到 Tomcat的bin目录下。而在Linux下可以直接解压和安装bin目录下的tomcat_native.tar.gz文件编译之前要确保apr 库已经安装。怎么才能判断Tomcat是否已经启用了APR库呢方法是通过看Tomcat的启动日志如果没有启用APR则启动日志一般有这么一条org.apache.coyote.http11.Http11Protocol start如果启用了APR则这条日志就会变成org.apache.coyote.http11.Http11AprProtocol starttcnative-1.dll 下载地址http://tomcat.heanet.ie/native/七、使用tomcat自带的dbcp数据库链接池tomcat5.0配置如下先修改server.xml,增加如下内容在 GlobalNamingResources标签里增加Resource nameCarmotDS typejavax.sql.DataSource/ ResourceParams nameCarmotDS parameter namefactory/name valueorg.apache.commons.dbcp.BasicDataSourceFactory/value /parameter parameter nameurl/name valuejdbc:oracle:thin:192.168.1.12:1521:igrp/value /parameter parameter namepassword/name valuecarmot/value /parameter parameter namemaxActive/name value500/value /parameter parameter namemaxWait/name value9000/value /parameter parameter namedriverClassName/name valueoracle.jdbc.driver.OracleDriver/value /parameter parameter nameusername/name valuecarmot_ystest/value /parameter parameter namemaxIdle/name value20/value /parameter /ResourceParamsmaxActive 是最大激活连接数这里取值为500表示同时最多有500个数据库连接。maxIdle是最大的空闲连接数这里取值为20表示即使没有数据库连接时依然可以保持20空闲的连接而不被清除随时处于待命状态。MaxWait是最大等待秒钟数这里取值-1表示无限等待直到超时为止也可取值 9000表示9秒后超时。修改confweb.xml,增加如下内容resource-ref descriptionDB Connection/description res-ref-nameCarmotDS/res-ref-name res-typejavax.sql.DataSource/res-type res-authContainer/res-auth /resource-ref然后修改 confCatalinalocalhostROOT.xml,在context标签里增加如下内容ResourceLink globalCarmotDS nameCarmotDS typejavax.sql.DataSource/Tomcat 5.5以上版本可以直接修改confCatalinalocalhostROOT.xml,在context标签里增加如下内容Resource nameCarmotDS authContainer typejavax.sql.DataSource maxActive500 maxIdle20 maxWait9000 driverClassNameoracle.jdbc.driver.OracleDriver usernamecarmot_ystest passwordcarmot urljdbc:oracle:thin:192.168.1.12:1521:igrp defaultAutoCommittrue removeAbandonedtrue removeAbandonedTimeout60 logAbandonedtrue/removeAbandonedTimeout60,表示60秒没有使用连接会自己回收资源.修改global-config.xmldatasourcejava:comp/env/CarmotDS/datasource八、admin/manager的安全设置配置文件conf/ tomcat-users.xml修改如下内容role rolenamemanager/role rolenameadmin/user usernameadmin passwordadmin rolesadmin,manager/上面的密码设置项记得设为一个复杂的密码或者干脆删除admin/manager目录tomcat中如何禁止列目录下的文件在{tomcat_home}/conf/web.xml中把listings参数设置成false即可如下servlet...init-paramparam-namelistings/param-nameparam-valuefalse/param-value/init-param.../servlet九、日志调整Logger classNameorg.apache.catalina.logger.FileLogger prefixlocalhost_log. suffix.txt timestamptrue/Valve className”org.apache.catalina.valves.AccessLogValve” directory”logs” prefix”access_log.” suffix”.log” pattern”combined” fileDateFormat”yyyy-MM-dd” resolveHosts”false”/调优综述根据以上分析如果想要Tomcat达到最优的效果首先要争取使得操作系统以及网络资源达到最优并且最好使用高版本的JDK。对于有大量静态页面的系统采用Apache集成Tomcat的方式把静态页面交由Apache处理动态部分交由Tomcat处理能极大解放Tomcat的处理能力。使用 ARP库也能极大的提高Tomcat对静态文件的处理能力。对于并发要求较高的系统采用Apache加Tomcat集群的方式将负载分别分担到多个 Tomcat上能很大的提高系统的性能充分利用硬件资源。同时需要对Tomcat自身进行优化包括增大内存、调节并发线程数等。