Tomcat 性能优化

Tomcat服务器的性能就能改善哦。
  1. 增加JVM堆(heap)
  2. 解决内存泄漏问题
  3. 线程池(thread pool)的设置
  4. 压缩
  5. 调节数据库性能
  6. Tomcat原生库(native library)
  7. 其他选项

第一步  – 提高JVM栈内存Increase JVM heap memory

你使用过tomcat的话,简单的说就是“内存溢出”. 通常情况下,这种问题出现在实际的生产环境中.产生这种问题的原因是tomcat使用较少的内存给进程,通过配置TOmcat的配置文件(Windows 下的catalina.bat或Linux下的catalina.sh)可以解决这种问题.这种解决方法是通过增加JVM的栈内存实现的.也就是说,JVM通常不去调用垃圾回收器,所以服务器可以更多关注处理web请求,并要求尽快完成。要更改文件(catalina.sh) 位于"\tomcat server folder\bin\catalina.sh",下面,给出这个文件的配置信息,

  1. JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 
  2. -server -Xms1024m -Xmx1024m  
  3. -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m  
  4. -XX:MaxPermSize=512m -XX:+DisableExplicitGC" 

-Xms – 指定初始化时化的栈内存

-Xmx – 指定最大栈内存

在重启你的Tomcat服务器之后,这些配置的更改才会有效。下面将介绍如何处理JRE内存泄漏.

第2步 - 解决JRE内存泄漏

另一个影响Tomcat 性能的因素是内存泄露,就像我前面提及的,可以通过更新到最新版本的Tomcat来获得较好性能和可扩展性.现在这句话将成为事实。如果我们使用最新的 tomcat 服务器版本6.0.26 或更高版本,可以解决此类错误。因为它包含一个监听器来处理 JRE 和 permgen 内存泄漏。这里使用的监听器是,

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

你可以找到上述监听器类配置文件 server.xml 在"tomcat project folder/conf/server.xml"中的。下一步我们将介绍如何调整连接器属性"maxThreads"

第三步 – 线程池设置

线程池指定Web请求负载的数量,因此,为获得更好的性能这部分应小心处理。可以通过调整连接器属性“maxThreads”完成设置。maxThreads的值应该根据流量的大小,如果值过低,将有没有足够的线程来处理所有的请求,请求将进入等待状态,只有当一个的处理线程释放后才被处理;如果设置的太大,Tomcat的启动将花费更多时间。因此它取决于我们给maxThreads设置一个正确的值

  1. <Connector port="8080" address="localhost" 
  2. maxThreads="250" maxHttpHeaderSize="8192" 
  3. emptySessionPath="true" protocol="HTTP/1.1" 
  4. enableLookups="false" redirectPort="8181" acceptCount="100" 
  5. connectionTimeout="20000" disableUploadTimeout="true" /> 

在上述配置中,maxThreads值设定为“250”,这指定可以由服务器处理的并发请求的最大数量。如果没有指定,这个属性的默认值为“200”。任何多出的并发请求将收到“拒绝连接”的错误提示,直到另一个处理请求进程被释放。错误看起来如下,

  1. org.apache.tomcat.util.threads.ThreadPool logFull SEVERE: All threads (250) are  
  2. currently busy, waiting. Increase maxThreads (250) or check the servlet status 

如果应用提示上述错误,务必检查上述错误是否是由于单个请求花费太长时间造成的,这个问题的原因是这样的,有时候如果数据库连接不释放的话,进程将不会处理其它请求。

注意: 如果请求的数量超过了“750”,这将不是意味着将maxThreads属性值设置为 “750”,它意外着最好使用“Tomcat集群”的多个实例。也就是说,如果有“1000”请求,两个Tomcat实例设置“maxThreads= 500”,而不在单Tomcat实例的情况下设置maxThreads=1000。 

根据我的经验,准确值的设定可以通过将应用在在各种环境中测试得出。接下来,我们来看看如何压缩的MIME类型。

第4步- 压缩

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

  1. <Connector port="8080" protocol="HTTP/1.1" 
  2. connectionTimeout="20000" 
  3. redirectPort="8181" compression="500" 
  4. compressableMimeType="text/html,text/xml,text/plain,application/octet-stream" />  

第五步- 数据库性能调优

Tomcat性能在等待数据库查询被执行期间会降低。如今大多数应用程序都是使用可能包含“命名查询”的关系型数据库。如果是那样的话,Tomcat会在启动时默认加载命名查询,这个可能会提升性能。另一件重要事是确保所有数据库连接正确地关闭。给数据库连接池设置正确值也是十分重要的。我所说的值是指 Resource要素的最大空闲数(maxIdle),最大连接数(maxActive),最大建立连接等待时间(maxWait)属性的值。因为配置依赖与应用要求,我也不能在本文指定正确的值。你可以通过调用数据库性能测试来找到正确的值。

第6步 – Tomcat原生库

Tomcat的原生库基于Apache可移植运行时(Apache Portable Runtime简称APR),给程序员提供了超强的扩展性和性能,在产品运作中帮助融合原生的服务器技术以展现最佳的性能。想知道安装说明的朋友请参考Tomcat Native Library – (APR) Installation

第7步 – 其他选项

这些选项是:

  • 开启浏览器的缓存,这样读取存放在webapps文件夹里的静态内容会更快,大大推动整体性能。
  • 每当开机时,Tomcat服务器应当自动地重启。
  • 一般情况下HTTPS请求会比HTTP请求慢。如果你想要更好的安全性,即使慢一点我们还是要选择HTTPS。
  • 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】


          内存由 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 –Xms128m –Xmx128m –XX: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.并发数设置
          默认的tomcat配置,并发测试时,可能30个USER上去就当机了。
          添加
         <Connector port="80" protocol="HTTP/1.1"
                 maxThreads="600"
                 minSpareThreads="100"
                 maxSpareThreads="500"
                 acceptCount="700"

                connectionTimeout="20000"
                redirectPort="8443" />
    说明
           maxThreads="600" ///最大线程数
           minSpareThreads="100"///初始化时创建的线程数
           maxSpareThreads="500"///一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。
           acceptCount="700"//指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理 

          maxthread太多,导致切换过多,性能下降严重。这个数量应该是你单个机器的承载能力, 压力测试下得出的结果。 不可任意加大。一般情况下, 256-512个已经非常高的数值了。
  • 更改后的配置

      <Connector port="9027"
      protocol="HTTP/1.1"
      maxHttpHeaderSize="8192"
      maxThreads="1000"
      minSpareThreads="100"
      maxSpareThreads="1000"
      minProcessors="100"
      maxProcessors="1000"
      enableLookups="false"
      compression="on"
      compressionMinSize="2048"
      compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
      connectionTimeout="20000"
      URIEncoding="utf-8"
      acceptCount="1000"
      redirectPort="8443"
      disableUploadTimeout="true"/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值