Tomcat 生产服务器性能优化

虑一下这种场景,你开发了一个应用,它有十分优秀的布局设计,最新的特性以及其它的优秀特色。可是在性能这方面欠缺,无论这个应用如何都会遭到客户拒绝。客户老是指望它们的应用应该有更好的性能。若是你在产品中使用了Tomcat服务器,那么这篇文章就会给你几方面来提高Tomcat服务器的性能。感谢ITWorld article给本文提供资源。通过沉思我已经知道了和早期版本相比最新的Tomcat提供更好的性能和稳定性。因此一直使用最新的Tomcat版本。如今本文使用下面几步来提升Tomcat服务器的性能。css

  1. 增长JVM堆内存大小
  2. 修复JRE内存泄漏
  3. 线程池设置
  4. 压缩
  5. 数据库性能调优
  6. Tomcat本地库
  7. 其它选项
Lesus
Lesus
翻译于 1年前

5人顶html

 

 翻译的不错哦!java

其它翻译版本(1)

第一步  – 提升JVM栈内存Increase JVM heap memorylinux

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

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

-Xms – 指定初始化时化的栈内存
-Xmx – 指定最大栈内存
在重启你的Tomcat服务器以后,这些配置的更改才会有效。下面将介绍如何处理JRE内存泄漏.web

MtrS
MtrS
翻译于 1年前

2人顶数据库

 

 翻译的不错哦!apache

其它翻译版本(1)

第二步 – 解决JRE内存泄露编程

性能表现不佳的另外一个主要缘由是内存泄漏,正如我以前说过:始终使用最新的tomcat服务器以得到更好的性能和可伸缩性。如今,这句话变成真的。若是咱们使用最新的tomcat版本6.0.26及以上就能够解决这个错误,由于它包含了一个监听器来处理JRE和PermGen的内存泄漏。使用的监听器是,浏览器

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

你能够在server.xml文件中找到这个监听器的配置,server.xml位置在“tomcat project folder/conf/server.xml”。接下来,咱们将看看如何调整链接属性“maxThreads”。

Garfielt
Garfielt
翻译于 1年前

2人顶

 

 翻译的不错哦!

其它翻译版本(1)

第三步 – 线程池设置

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

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

1人顶

 

 翻译的不错哦!

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

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

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

Garfielt
Garfielt
翻译于 1年前

1人顶

 

 翻译的不错哦!

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

根据个人经验,准确值的设定能够经过将应用在在各类环境中测试得出。接下来,咱们来看看如何压缩的MIME类型。 
Garfielt
Garfielt
翻译于 1年前

1人顶

 

 翻译的不错哦!

其它翻译版本(1)

第4步- 压缩

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

?
1
2
3
4
<Connector port= "8080" protocol= "HTTP/1.1"
connectionTimeout= "20000"
redirectPort= "8181" compression= "500"
compressableMimeType= "text/html,text/xml,text/plain,application/octet-stream" />
在前面的配置中,当文件的大小大于等于500bytes时才会压缩。若是当文件达到了大小可是却没有被压缩,那么设置属性compression="on"。不然Tomcat默认设置是“off”。接下来咱们将看看如何调优数据库。
Lesus
Lesus
翻译于 1年前

1人顶

 

 翻译的不错哦!

其它翻译版本(1)

第五步- 数据库性能调优

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

Lesus
Lesus
翻译于 1年前

1人顶

 

 翻译的不错哦!

第6步 – Tomcat原生库

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

第7步 – 其余选项

这些选项是:

  • 开启浏览器的缓存,这样读取存放在webapps文件夹里的静态内容会更快,大大推进总体性能。
  • 每当开机时,Tomcat服务器应当自动地重启。
  • 通常状况下HTTPS请求会比HTTP请求慢。若是你想要更好的安全性,即便慢一点咱们仍是要选择HTTPS。

就这么多啦。在这篇文章里,我教给了你们一些提升Tomcat服务器性能的方法。若是你以为这篇文章有用,或者你对提升Tomcat服务器性能有别的见解,请不要忘记留下宝贵的评论。祝你今天编程愉快!

 

 

 

 

 

 

 

 

 

 

优化tomcat参数

    这里以tomcat7的参数配置为例,须要修改conf/server.xml文件,主要是优化链接配置,关闭客户端dns查询。

  1. <Connector port="8080"   
  2.            protocol="org.apache.coyote.http11.Http11NioProtocol"  
  3.            connectionTimeout="20000"  
  4.            redirectPort="8443"   
  5.            maxThreads="500"   
  6.            minSpareThreads="20"  
  7.            acceptCount="100" 
  8.            disableUploadTimeout="true" 
  9.            enableLookups="false"   
  10.            URIEncoding="UTF-8" /> 

5. 改用APR库

    tomcat默认采用的BIO模型,在几百并发下性能会有很严重的降低。tomcat自带还有NIO的模型,另外也能够调用APR的库来实现操做系统级别控制。

    NIO模型是内置的,调用很方便,只须要将上面配置文件中protocol修改为org.apache.coyote.http11.Http11NioProtocol,重启便可生效。上面配置我已经改过了,默认的是HTTP/1.1。

    APR则须要安装第三方库,在高并发下会让性能有明显提高。具体安装办法能够参考http://www.cnblogs.com/huangjingzhou/articles/2097241.html。安装完成后重启便可生效。如使用默认protocal就是apr,但最好把将protocol修改为org.apache.coyote.http11.Http11AprProtocol,会更加明确

    在官方找到一个表格详细说明了这三种方式的区别:

  1.                   Java Blocking Connector   Java Nio Blocking Connector   APR/native Connector 
  2.                              BIO                         NIO                       APR 
  3. Classname                AjpProtocol               AjpNioProtocol           AjpAprProtocol 
  4. Tomcat Version           3.x onwards                 7.x onwards              5.5.x onwards 
  5. Support Polling              NO                          YES                       YES 
  6. Polling Size                 N/A                   maxConnections             maxConnections 
  7. Read Request Headers      Blocking                  Sim Blocking                   Blocking 
  8. Read Request Body         Blocking                  Sim Blocking                   Blocking 
  9. Write Response            Blocking                  Sim Blocking                   Blocking 
  10. Wait for next Request     Blocking                  Non Blocking               Non Blocking 
  11. Max Connections        maxConnections              maxConnections             maxConnections 

6. 优化网络

    Joel也明确提出了优化网卡驱动能够有效提高性能,这个对于集群环境工做的时候尤其重要。因为咱们采用了linux服务器,因此优化内核参数也是一个很是重要的工做。给一个参考的优化参数:

  1. 1. 修改/etc/sysctl.cnf文件,在最后追加以下内容: 
  2.  
  3. net.core.netdev_max_backlog = 32768 
  4. net.core.somaxconn = 32768 
  5. net.core.wmem_default = 8388608 
  6. net.core.rmem_default = 8388608 
  7. net.core.rmem_max = 16777216 
  8. net.core.wmem_max = 16777216 
  9. net.ipv4.ip_local_port_range = 1024 65000 
  10. net.ipv4.route.gc_timeout = 100 
  11. net.ipv4.tcp_fin_timeout = 30 
  12. net.ipv4.tcp_keepalive_time = 1200 
  13. net.ipv4.tcp_timestamps = 
  14. net.ipv4.tcp_synack_retries = 
  15. net.ipv4.tcp_syn_retries = 
  16. net.ipv4.tcp_tw_recycle = 
  17. net.ipv4.tcp_tw_reuse = 
  18. net.ipv4.tcp_mem = 94500000 915000000 927000000 
  19. net.ipv4.tcp_max_orphans = 3276800 
  20. net.ipv4.tcp_max_syn_backlog = 65536 
  21.  
  22. 2. 保存退出,执行sysctl -p生效 

7. 让测试说话

    优化系统最忌讳的就是只调优不测试,有时不适当的优化反而会让性能更低。以上全部的优化方法都要在本地进行性能测试事后再不断调整参数,这样最终才能达到最佳的优化效果。

 

补充Bio、Nio、Apr模式的测试结果:

    对于这几种模式,我用ab命令模拟1000并发测试10000词,测试结果比较意外,为了确认结果,我每种方式反复测试了10屡次,而且在两个服务器上都测试了一遍。结果发现Bio和Nio性能差异很是微弱,难怪默认竟然仍是Bio。可是采用apr,链接创建的速度会有50%~100%的提高。直接调用操做系统层果真神速啊,这里强烈推荐apr方式!

相关文章
相关标签/搜索