Tomcat6性能优化

1.内存设置
      Windows环境下修改“%TOMCAT_HOME%\bin\catalina.bat”文件,在文件开头增加如下设置:set JAVA_OPTS=-Xms256m -Xmx512m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m

      -Xms设置初始化内存大小
      -Xmx设置可以使用的最大内存
      -Xmn:内存最小值,-Xmn128-256m就够了

      JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于 40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、 -Xmx相等以避免在每次GC 后调整堆的大小。 
      在较大型的应用项目中,默认的内存是不够的,有可能导致系统无法运行。常见的问题是报Tomcat内存溢出错误“java.lang.OutOfMemoryError: Java heap space”,从而导致客户端显示500错误。

      -XX:PermSize=128M
      -XX:MaxPermSize=256m,默认为32M

      PermSize/MaxPermSize:定义Perm段的尺寸,PermSize为JVM启动时Perm的内存大小;MaxPermSize为最大可占用的Perm内存大小。
      PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现“java.lang.OutOfMemoryError: PermGen space”错误。
      对于WEB项目,jvm加载类时,永久域中的对象急剧增加,从而使jvm不断调整永久域大小,为了避免调整),你可以使用更多的参数配置。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小,那么就会产生此错误信息了。

      -XX:NewSize,默认为2M,此值设大可调大新对象区,减少Full GC次数
      -XX:MaxNewSize,默认为16M
      -XX:NewRatio,默认为8
      -XX:SurvivorRatio=NewRatioSize 
      -XX:userParNewGC 可用来设置并行收集【多CPU】
      -XX:ParallelGCThreads 可用来增加并行度【多CPU】
      -XXUseParallelGC 设置后可以使用并行清除收集器【多CPU】

javamemory.png?psid=1
      内存由 Perm 和 Heap 组成. 其中
              Heap = {Old + young = { Eden , from, to } }
      -XX:NewRatio:改变新旧空间的尺寸比例,这个比例的缺省值是8,意思是新空间的尺寸是旧空间的1/8。 
      -XX:SurvivorRatio:改变Eden对象空间和残存空间的尺寸比例,这个比例的缺省值是10,意思是Eden对象空间的尺寸比残存空间大survivorRatio+2倍。 
      例:下面的命令把整个堆设置成128m,新域比率设置成3,即新域与旧域比例为1:3,新域为堆的1/4或32M:
              java �CXms128m �CXmx128m �CXX:NewRatio =3


      如果不是执行startup.bat启动tomcat而是利用windows的系统服务启动tomcat服务,上面的设置就不生效了。解决办法:
      修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\Tomcat6\Parameters\JavaOptions
原值为
-Dcatalina.home=E:\Tomcat 6.0
-Dcatalina.base=E:\Tomcat 6.0
-Djava.endorsed.dirs=E:\Tomcat 6.0\common\endorsed
-Djava.io.tmpdir=E:\Tomcat 6.0\temp
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=E:\Tomcat 6.0\conf\logging.properties
加入 -Xms256m -Xmx512m,重起tomcat服务,设置生效

      Linux环境下修改“%TOMCAT_HOME%\bin\catalina.sh”文件,在文件开头增加如下设置:JAVA_OPTS=’-Xms256m -Xmx512m’

2.并发数设置
    

在WEB的大型应用中,对于Tomcat的配置优化显得尤其重要,它会造成非常严重的并发危机。因此它是除了WEB服务器以及数据库服务器之外,也同时需要大量的时间进行实地的测试与优化。

一、修改tomcat配置文件

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

        maxHttpHeaderSize="8192"

        maxThreads="512"

        minSpareThreads="100"

        maxSpareThreads="200"

        enableLookups="false"

        redirectPort="8443"

        acceptCount="500"

        connectionTimeout="30000"

        disableUploadTimeout="true"/>

    参数分析:

       (1)、maxHttpHeaderSize=”8192” 

        此选项用于配置:来自于客户端请求的Request和Response的HTTP header

        的最大长度,以字节计算。如果不设置,该属性为4096(4K)。

       (2)、maxThreads="512"

             Connector创建的请求处理线程的最大值,它决定了能够同时处理并发请求的最

             大值。如果不指定,该属性值为200。Tomcat的线程数量太多会导致切换过多,性能

             下降严重。这个数量应该是你单个机器的承载能力,压力测试下得出的结果。不可任意

             加大。一般情况下,256-512个已经非常高的数值了。

       (3)、minSpareThreads="100"

              tomcat初始化时创建的线程数,即最小工作线程数目。

       (4)、maxSpareThreads="300"

              tomcat所允许的最大线程数,一旦创建的线程超过这个数,Tomcat就将关闭不

              再需要的Socket线程。

       (5)、enableLookups="false"

              使用允许DNS查询,通常情况下设置为false。如果为true则tomcat会损耗一

             部分系统性能。

       (6)、redirectPort="8443"

              这里系统默认的,它指定转发端口,如果当前只支持non-SSL请求,在需要安全

              通信的场所,将把客户请求转发至SSL的redirectPort端口。

       (7)、acceptCount=“200”

              当所有请求处理线程都被占用时,允许接收请求队列的最大长度。当队列已满时,

              任何收到的请求都将被拒绝。缺省值为10。

       (8)、connectionTimeout="50000"

              Connector接收连接后,等待提供请求URI的时间,缺省值为60000(60秒)。

       (9)、disableUploadTimeout="true"

              该标志位表明当执行servlet时,是否允许servlet容器使用一个不同的、更长的

              连接超时。启用该标志位将导致在上传数据时,要么使用更长的时间完成上传,要么

              出现更长的超时。如果不指定,该属性为“false”。

       (10)、有时不光要优化tomcat,同时还需要更改Linux的一些系统参数。如果WEB

             服务器进行压力测试时报socket不足,则些可以对/etc/security/limits.conf进行相应修改:

                   * soft nofile 57766

                   * hard nofile 65535

 

二、优化tomcat启动的初始内存设置($TOMCAT_HOME/bin/catalina.sh)

       JAVA_OPTS="-server -Xms2048M -Xmx2048M -Xss128k -XX:+AggressiveOpts -XX:+UseParallelGC  -XX:+UseBiasedLocking"

参数详解:

       (1)、-Xms2048M

        JAVA虚拟机初始化时使用的内存大小,为了减少tomcat频繁的申请内存,此参数

    应该和Xmx设置的参数一样大。

    (2)、-Xmx2048M

        JAVA虚拟机可以使用的最大内存,此参数的最大设置不允许超过物理内存的90%。

       (3)、-XX:+AggressiveOpts

        加快编译

       (4)、-Xss128k

        设置tomcat每增加一个线程(Thread)就会立即消耗128K内存,最佳值应该是128,

    默认值是512K。见意256K大小,这个对性能影响较大,需要多次测试。减少这个值可

    以增加一个进程内的线程数量。

       (5)、-XX:+UseParallelGC

        一些测试表明当非64位系统,并且非高性能服务器时,这个选项会造成垃圾回收

    变慢。(此选项决定对垃圾回收是否采用多线程)

       (6)、-XX:+UseBiasedLocking"

        非竞争性的同步选项,锁机制的性能改善。

       (7)、-XX:PermSize=256m

              最小堆大小,一般把内存不足时就是把这个空间不足。默认为物理内存的1/4。

       (8)、-XX:+DisableExplicitGC

禁止System.gc(),免得程序员误调用gc方法影响性能。

       下面给出见意设置:

JAVA_OPTS="-server -Xms512M -Xmx512M -Xss256k -XX:+AggressiveOpts   -XX:+UseBiasedLocking"

 

 <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"

                maxHttpHeaderSize="8192"

                minProcessors="100"

                maxProcessors="5000"

                maxThreads="5000"

                minSpareThreads="1000"

                maxSpareThreads="4000"

                enableLookups="false"

                acceptCount="3500"

                disableUploadTimeout="true"

                connectionTimeout="20000"

                debug="0"

                redirectPort="8443" />

 

 

maxThreads:Tomcat可创建的最大的线程数,每一个线程处理一个请求;

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

maxSpareThreads:最大备用线程数,一旦创建的线程超过这个值,Tomcat就会关闭(应该有个超时时间吧,超时后关闭)不再需要的socket线程;

所以maxThreads决定了tomcat的最大线程阀值,需要设置的大一些

Tomcat性能参数设置

参数详解:

默认参数不适合生产环境使用,因此需要修改一些参数

 

1、修改启动时内存参数、并指定JVM时区 (在windows server 2008 下时间少了8个小时):

 

在Tomcat上运行j2ee项目代码时,经常会出现内存溢出的情况,解决办法是在系统参数中增加系统参数: 

 

window下, 在catalina.bat最前面:
set JAVA_OPTS=-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m;-Duser.timezone=GMT+08;
一定加在catalina.bat最前面。

 

linux下,在catalina.sh最前面增加:

JAVA_OPTS="-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m -Duser.timezone=Asia/Shanghai"

 

注意:前后二者区别,有无set,有无双引号。

 

 

2、线程池配置(Tomcat6下)

使用线程池,用较少的线程处理较多的访问,可以提高tomcat处理请求的能力。使用方式:

首先。打开/conf/server.xml,增加

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" 
        maxThreads="500" minSpareThreads="20" maxIdleTime="60000" />

最大线程500(一般服务器足以),最小空闲线程数20,线程最大空闲时间60秒。

然后,修改<Connector ...>节点,增加executor属性,如:

<Connector executor="tomcatThreadPool" 
               port="80"

protocol="HTTP/1.1"

maxThreads="600"

minSpareThreads="100"

maxSpareThreads="300"
               connectionTimeout="60000"
               keepAliveTimeout="15000"
               maxKeepAliveRequests="1"
               redirectPort="443"
               ....../>

maxThreads:Tomcat可创建的最大的线程数,每一个线程处理一个请求;

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

maxSpareThreads:最大备用线程数,一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程;

acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,就是被排队的请求数,超过这个数的请求将拒绝连接。

connnectionTimeout:网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。 
enableLookups:是否允许DNS查询

 

注意:可以多个connector公用1个线程池。

 

3、调整连接相关Connector的参数:

<Connector executor="tomcatThreadPool"
               port="80" protocol="HTTP/1.1" 
               connectionTimeout="60000"
               keepAliveTimeout="15000"
               maxKeepAliveRequests="1"
               redirectPort="443"
               maxHttpHeaderSize="8192" URIEncoding="UTF-8" enableLookups="false" acceptCount="100" disableUploadTimeout="true"/>

 

参数说明:

  • connectionTimeout - 网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。

  • keepAliveTimeout - 长连接最大保持时间(毫秒)。此处为15秒。

  • maxKeepAliveRequests - 最大长连接个数(1表示禁用,-1表示不限制个数,默认100个。一般设置在100~200之间) the maximum number of HTTP requests that can be held in the pipeline until the connection is closed by the server. Setting this attribute to 1 disables HTTP/1.0 keep-alive, as well as HTTP/1.1 keep-alive and pipelining. Setting this to -1 allows an unlimited number of pipelined or keep-alive HTTP requests. If not specified, this attribute is set to 100.

  • maxHttpHeaderSize - http请求头信息的最大程度,超过此长度的部分不予处理。一般8K。

  • URIEncoding - 指定Tomcat容器的URL编码格式。

  • acceptCount - 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,默认为10个。defines the maximum queue length for incoming connection requests when all possible request processing threads are in use. Any requests received when the queue is full are refused. The default value is 10.

  • disableUploadTimeout - 上传时是否使用超时机制

  • enableLookups - 是否反查域名,取值为:true或false。为了提高处理能力,应设置为false

  • bufferSize - defines the size (in bytes) of the buffer to be provided for input streams created by this connector. By default, buffers of 2048 bytes are provided.

  • maxSpareThreads - 做多空闲连接数,一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程 the maximum number of unused request processing threads that are allowed to exist until the thread pool starts stopping the unnecessary threads. The default value is 50.

  • maxThreads - 最多同时处理的连接数,Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。。 the maximum number of request processing threads to be created by this Connector, which therefore determines the maximum number of simultaneous requests that can be handled. If not specified, this attribute is set to 200.

  • minSpareThreads - 最小空闲线程数,Tomcat初始化时创建的线程数 the number of request processing threads that are created when this Connector is first started. The connector will also make sure it has the specified number of idle processing threads available. This attribute should be set to a value smaller than that set for maxThreads. The default value is 4.

  • minProcessors - 最小空闲连接线程数,用于提高系统处理性能,默认值为10。(用于Tomcat4中)

  • maxProcessors - 最大连接线程数,即:并发处理的最大请求数,默认值为75。(用于Tomcat4中)

备注:

Tomcat4中可以通过修改minProcessors和maxProcessors的值来控制线程数。

在Tomcat5+主要对以下参数调整
maxThreads
 Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。
 acceptCount 
 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。
 connnectionTimeout 
 网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。
 minSpareThreads 
 Tomcat初始化时创建的线程数。
 maxSpareThreads 
 一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。  

 

 

 4、负载均衡、集群的配置

Tomcat6支持分布式部署,可以实现集群功能,提高响应能力。

 

5、

利用JMX监控Tomcat运行情况,需要手工调整启动参数,如下:

打开cataline.bat,增加一行

set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.port=10090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"

 

linux下修改cataline.sh:
JAVA_OPTS="-Dcom.sun.management.jmxremote.port=10090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=%CATALINA_BASE\conf\logging.properties"

注意JDK\jre\lib\management\management.properties文件必须存在。

 

重新启动tomcat节点,然后用jconsole连接(此处端口wei10090)

 

6、Tomcat增加一个应用

在server.xml的Host标签中增加行

<Context displayName="OA" docBase="/app/web-apps/GACWP" path="" />

path代表上下文名称,空表示是根路径。

 


参考文献
1.我在linux系统下web系统. http://www.iteye.com/topic/299988
2.Tomcate启动内存设置.http://blog.csdn.net/peijunlin/archive/2009/06/05/4244401.aspx
3.Tomcat6 一些调优设置内存和连接数.http://mcncc.com/simple/?t25909.html
4.Java虚拟机参数 -XX等相关参数应用. 

原文:http://blog.chinaunix.net/uid-122937-id-201606.html

你可能感兴趣的:(Tomcat6性能优化)