tomcat性能调优

来源:互联网 发布:自动门机组 淘宝 编辑:程序博客网 时间:2024/05/21 17:02

在${TOMCAT_HOME}/bin/catalina.bat文件,增加以下内容:

set JAVA_OPTS=-server -Xms1024M -Xmx1024M -Xss64k -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC  -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m  -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly

以下是参数说明:

/bin/catalina.bat

参数意义

参考值

-server

tomcat以server模式运行时将拥有:更大、更高的并发处理能力,更快更强捷的JVM垃圾回收机制,可以获得更多的负载与吞吐量。

 

-Xms –Xmx :

JVM内存设置了,把Xms与Xmx两个值设成一样是最优的做法,一个系统随着并发数越来越高,它的内存使用情况逐步上升,上升到最高点不能上升了,开始回落,在内存回落时它付出的代价是CPU高速开始运转进行垃圾回收,此时严重的甚至会造成系统出现“卡壳”,在操作时突然网页像死在那边一样几秒甚至十几秒时间,因为JVM正在进行垃圾回收。因此一开始就把这两个设成一样,使得Tomcat在启动时就为最大化参数充分利用系统的效率。

1024M

-Xss :

设定每个线程的堆栈大小。看一个线程大约需要占用多少内存,可能会有多少线程同时运行等。一般不易设置超过1M,要不然容易出现out ofmemory。

 

-XX:+UseBiasedLocking:

启用一个优化了的线程锁,在appserver,每个http请求就是一个线程,有的请求短有的请求长,就会有请求排队的现象,甚至还会出现线程阻塞,这个优化了的线程锁使得appserver内对线程处理自动进行最优调配。

 

-XX:PermSize=128M-XX:MaxPermSize=256M:

JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;在数据量的很大的文件导出时,一定要把这两个值设置上,否则会出现内存溢出的错误。

 

XX:MaxPermSize

设置最大非堆内存的大小,默认是物理内存的1/4。

那么,如果是物理内存4GB,那么64分之一就是64MB,这就是PermSize默认值,也就是永生代内存初始大小;

四分之一是1024MB,这就是MaxPermSize默认大小。

 

 -XX:+DisableExplicitGC:

在程序代码中不允许有显示的调用”System.gc()”。手动调用System.gc()不能解决out ofmemory问题,会导致系统响应时间严重降低。 

 

-XX:+UseParNewGC:

对年轻代采用多线程并行回收,这样收得快

 

-XX:+UseConcMarkSweepGC:

即CMS gc,这一特性只有jdk1.5即后续版本才具有的功能,它使用的是gc估算触发和heap占用触发。

频繁的GC会造成JVM的大起大落从而影响到系统的效率,因此使用了CMS GC后可以在GC次数增多的情况下,每次GC的响应时间却很短,比如说使用了CMS GC后经过jprofiler的观察,GC被触发次数非常多,而每次GC耗时仅为几毫秒。

 

 

-XX:MaxTenuringThreshold:

设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。

这个值的设置需要根据本地的jprofiler监控后得到的一个理想的值。

 

-XX:+CMSParallelRemarkEnabled:

在使用UseParNewGC 的情况下, 尽量减少 mark 的时间

 

-XX:+UseCMSCompactAtFullCollection:

在使用concurrent gc 的情况下, 防止 memoryfragmention, 对live object 进行整理, 使 memory 碎片减少。

 

-XX:LargePageSizeInBytes:

指定 Java heap的分页页面大小

 

-XX:+UseFastAccessorMethods:

get,set 方法转成本地代码

 

-XX:+UseCMSInitiatingOccupancyOnly:

指示只有在 oldgeneration 在使用了初始化的比例后concurrent collector 启动收集。

 

1.1  线程参数调优

在${TOMCAT_HOME}/conf/server.xml文件,修改以下内容:

<Connector port="8080" protocol="HTTP/1.1"

      URIEncoding="UTF-8"  minSpareThreads="150" maxSpareThreads="300"

          connectionTimeout="20000" acceptCount="300"  maxThreads="300" maxProcessors="1000"  minProcessors="5"  redirectPort="8443"

          useURIValidationHack="false"

/>

以下是参数说明:

/conf/server.xml

参数意义

参考值

connectionTimeout

网络连接超时时间毫秒数

20000

maxThreads

Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数,即最大并发数。

500

minSpareThreads

最小备用线程数,tomcat启动时的初始化的线程数

 

maxSpareThreads

如果空闲状态的线程数多于设置的数目,则将这些线程中止,减少这个池中的线程总数。

 

acceptCount

当线程数达到maxThreads后,后续请求会被放入一个等待队列,这个acceptCount是这个队列的大小,如果这个队列也满了,就直接refuse connection,最好和maxThreads值设置一样

500

useURIValidationHack

减少它对一些url的不必要的检查从而减省开销

 

    注:以上参数会根据实际环境,包括服务器硬件参数、在线用户数、并发用户数等需求进行实际调整。

1.2  其他方式优化

1.2.1 JRE内存泄露

性能表现不佳的另一个主要原因是内存泄漏,tomcat版本6.0.26及以上就可以解决这个错误,因为它包含了一个监听器来处理JRE和PermGen的内存泄漏。使用的监听器在server.xml中配置:

<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />

1.2.2 禁用DNS查询

当web应用程序向要记录客户端的信息时,它也会记录客户端的IP地址或者通过域名服务器查找机器名转换为IP地址。DNS查询需要占用网络,并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的IP的过程,这样会消耗一定的时间。为了消除DNS查询对性能的影响我们可以关闭DNS查询,方式是找到server.xml文件中的<Connector port="8080">并修改enableLookups参数值:

enableLookups="false" disableUploadTimeout="true"

以下是参数说明:

/conf/server.xml

参数意义

参考值

enableLookups

是否反查域名,为了消除DNS查询对性能的影响我们可以关闭DNS查询

false

disableUploadTimeout

类似于Apache中的keeyalive一样

 

1.2.3 压缩配置

Tomcat有一个通过在server.xml配置文件中设置压缩的选项。压缩可以在connector像如下设置中完成:

<Connector port="8080" protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443" compression="500"

compressableMimeType="text/html,text/xml,text/plain,application/octet-stream" />

以下是参数说明:

/conf/server.xml

参数意义

参考值

compression

打开压缩功能

on

compressionMinSize

启用压缩的输出内容大小,这里面默认为2KB

2048

compressableMimeType

压缩类型

 

 

1.3  Apache和Tomcat集群方式优化

Apache和Tomcat集成起来,将html和jsp的功能部分进行明确分工,让Tomcat只处理jsp部分,其他的由Apache,IIS等web服务器去处理,由此大大提高Tomcat的运行效率。 对于并发要求很高的系统,我们需要采取负载均衡的方式来分担Tomcat服务器的压力。

经过验证,系统对大用户量使用的响应方面,Apache+3Tomccat集群> Apache+2Tomcat集群 > Apache集成Tomcat > 单个Tomcat。并且采用Apache+多Tomcat集群的部署方式时,如果一个Tomcat出现宕机,系统可以继续使用,所以在硬件系统性能足够优越的情况下,需要尽量发挥软件的性能,可以采用增加Tomcat集群的方式。

    有关Apache和Tomcat的集群配置,参见文档《CWAP_Apache负载均衡及session共享环境部署方案说明.docx》。

打开${Apache_HOME}/conf/httpd.conf文件,找到如下代码,把第二行的注释“#”去掉:

# Server-pool management (MPM specific)
Include conf/extra/httpd-mpm.conf

修改${Apache_HOME}/conf/extra/httpd-mpm.conf文件,找到

<IfModule mpm_winnt_module>
ThreadsPerChild 150

MaxRequestsPerChild 0

</IfModule>

ThreadsPerChild是每个子进程最大并发线程数,一般情况下,以小型网站1000、中型网站1000~2000、大型网站2000~3500的量级进行调整。

1.4  配置参考

影响因素

配置

网络环境

内网

操作系统

64位Windows

内存

4G

处理器

4

Apache线程数

1000

Tomcat数量

2

Tomcat线程数

1000

Tomcat的JVM内存

1024M

Druid连接池大小

100

Mysql连接数

500

注:使用以上配置在单次请求实现单条数据库插入,10,000,000次请求,1100并发的情况下,90%的请求在3s内完成。因在开发机上运行,会受到开发机其他安装软件的一定影响,供参考。


0 0