【技巧】Tomcat生产服务器性能优化

系统 1341 0

 

1. 服务器资源

  •     对于高并发情况下会有大量的运算,那么CPU的速度会直接影响到处理速度。 
  •     内存在大量数据处理的情况下,将会有较大的内存容量需求,可以用-Xmx -Xms -XX:MaxPermSize等参数对内存不同功能块进行划分。我们之前就遇到过内存分配不足,导致虚拟机一直处于full GC,从而导致处理能力严重下降。

 

2. 开启内容压缩

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

 

3. 采用集群

    单个服务器性能总是有限的,最好的办法自然是实现横向扩展,那么组建tomcat集群是有效提升性能的手段。

    我们还是采用了Nginx来作为请求分流的服务器,后端多个tomcat协同工作。

 

4. 优化tomcat参数

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

      <Connector port="8080"
      
        protocol ="org.apache.coyote.http11.Http11NioProtocol"
        executor ="tomcatThreadPool"
        compression ="on"
        compressionMinSize ="2048"
        maxThreads="30000" <!-- 这个要看服务器内存多大了-->
        minSpareThreads="100"
        maxSpareThreads="2048"
        enableLookups="false"
        redirectPort="8443"
        acceptCount="35000"
        debug="0"
        connectionTimeout="40000"
        disableUploadTimeout="true" URIEncoding="UTF-8" useBodyEncodingForURI="true" />

Tomcat连接器池

      <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="1000" minSpareThreads="350" />
    

       线程池名:           name="tomcatThreadPool"

       线程前缀:           namePrefix="catalina-exec-"

       最大产生线程数:maxThreads="1000"

       最小初始现程数:minSpareThreads="350"

5. 改用APR库

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

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

    APR则需要安装第三方库,在高并发下会让性能有明显提升。具体安装办法可以参考 下面红色内容 。安装完成后重启即可生效。如使用默认protocal就是apr,但最好把将protocol修改成org.apache.coyote.http11.Http11AprProtocol,会更加明确。

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

                        Java Blocking Connector   Java Nio Blocking Connector   APR/
      
        native
      
      
         Connector 

                             BIO                         NIO                       APR 

Classname                AjpProtocol               AjpNioProtocol           AjpAprProtocol 

Tomcat Version           
      
      3.x onwards                 7.x onwards              5.5
      
        .x onwards 

Support Polling              NO                          YES                       YES 

Polling Size                 N
      
      /
      
        A                   maxConnections             maxConnections 

Read Request Headers      Blocking                  Sim Blocking                   Blocking 

Read Request Body         Blocking                  Sim Blocking                   Blocking 

Write Response            Blocking                  Sim Blocking                   Blocking 

Wait 
      
      
        for
      
      
         next Request     Blocking                  Non Blocking               Non Blocking 

Max Connections        maxConnections              maxConnections             maxConnections 
      
    

6. 优化网络

    Joel也明确提出了优化网卡驱动可以有效提升性能,这个对于集群环境工作的时候尤为重要。由于我们采用了linux服务器,所以优化内核参数也是一个非常重要的工作。给一个参考的优化参数:

  修改/etc/sysctl.cnf文件,在最后追加如下内容: 

      net.core.netdev_max_backlog = 32768
      
         

net.core.somaxconn 
      
      = 32768
      
         

net.core.wmem_default 
      
      = 8388608
      
         

net.core.rmem_default 
      
      = 8388608
      
         

net.core.rmem_max 
      
      = 16777216
      
         

net.core.wmem_max 
      
      = 16777216
      
         

net.ipv4.ip_local_port_range 
      
      = 1024 65000
      
         

net.ipv4.route.gc_timeout 
      
      = 100
      
         

net.ipv4.tcp_fin_timeout 
      
      = 30
      
         

net.ipv4.tcp_keepalive_time 
      
      = 1200
      
         

net.ipv4.tcp_timestamps 
      
      = 0
      
         

net.ipv4.tcp_synack_retries 
      
      = 2
      
         

net.ipv4.tcp_syn_retries 
      
      = 2
      
         

net.ipv4.tcp_tw_recycle 
      
      = 1
      
         

net.ipv4.tcp_tw_reuse 
      
      = 1
      
         

net.ipv4.tcp_mem 
      
      = 94500000 915000000 927000000
      
         

net.ipv4.tcp_max_orphans 
      
      = 3276800
      
         

net.ipv4.tcp_max_syn_backlog 
      
      = 65536 
    

7. 让测试说话

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

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

    对于这几种模式,我用ab命令模拟1000并发测试10000词,测试结果比较意外,为了确认结果,我每种方式反复测试了10多次,并且在两个服务器上都测试了一遍。结果发现Bio和Nio性能差别非常微弱,难怪默认居然还是Bio。但是采用apr,连接建立的速度会有50%~100%的提升。直接调用操作系统层果然神速啊,这里强烈推荐apr方式!

-------------------------------------------------------- ↓------tomcat7.0.8的高级应用-apr1.4.2安装------↓ -------------------------------------------------------------------

一 windows下安装  
直接拷贝tcnative-1.dll到TOMCAT_HOME/bin目录下,启动即可 
下载地址 http://archive.apache.org/dist/tomcat/tomcat-connectors/native/ 

二 linux centos4.8或者ubuntu10.10 server安装  
1.下载包 
到http://apr.apache.org/下载下面3个包 
apr-1.4.2.tar.gz 
apr-iconv-1.2.1.tar.gz 
apr-util-1.3.10.tar.gz 
java版本jdk-6u23-linux-x64-rpm.bin 
tomcat版本apache-tomcat-7.0.8.tar.gz 

三 安装JDK,tomcat  
安装JDK并设置环境变量 
vi /etc/profile #在他文件末尾处添加下面的变量 
# java 
JAVA_HOME=/usr/java/jdk1.6.0_23 
PATH=$JAVA_HOME/bin:$PATH 
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 
export JAVA_HOME 
export PATH 
export CLASSPATH 
执行 
source /etc/profile 
此时环境变量生效果 

apache-tomcat-7.0.8.tar.gz解压缩到/usr/local/下面 

四 安装apr插件  
1)安装apr 
tar zxvf apr-1.4.2.tar 
cd apr-1.4.2 
./configure --prefix=/usr/local/apr 
make 
make install 

2)安装apr-iconv 
程序代码 
tar -zxvf apr-iconv-1.2.1.tar.gz 
cd apr-iconv-1.2.1 
./configure --prefix=/usr/local/apr-iconv --with-apr=/usr/local/apr 
make 
make install 

3)安装apr-util 
程序代码 
tar zxvf apr-util-1.3.10.tar.gz 
cd apr-util-1.3.10 
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv/bin/apriconv 
make 
make install 

4)安装tomcat-native 
程序代码 
tar zxvf tomcat-native-1.1.20-src.tar.gz 
cd tomcat-native-1.1.20-src/jni/native   
./configure --with-apr=/usr/local/apr --with-java-home=/usr/java/jdk1.6.0_23 
make 
make install 

5)添加环境变量 
vi /etc/profile #在他文件末尾处添加下面的变量 
# apr 
export LD_LIBRARY_PATH=/usr/local/apr/lib 
执行 
source /etc/profile 
此时环境变量生效果 

启动tomcat 
TOMCAT_HOME/bin/start.sh 
more TOMCAT_HOME/logs/catalina.out 

即可看到 
Aug 29, 2010 3:47:32 PM org.apache.catalina.core.AprLifecycleListener init 
INFO: Loaded APR based Apache Tomcat Native library 1.1.20. 
优化完成

 

【技巧】Tomcat生产服务器性能优化


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论