Tomcat性能优化

          JVM性能优化

             在catalina.sh的头部中添加以下JVM性能调优配置信息

   export JAVA_OPTS="    -server
            -Xms2048M
            -Xmx2048M
            -Xss512k
            -XX:+AggressiveOpts
            -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
            -Djava.awt.headless=true"
          JVM配置参数说明
          server                                                 以真实的production的模式在运行的
           -Xms                                                  JVM最小堆内存设置
           –Xmx                                                  JVM最大堆内存设置
           -Xss                                                    设定每个线程的堆栈大小,不能超过1M
           –Xmn                                                 设置堆的年轻代大小
           -XX:+AggressiveOpts                      每当JDK版本升级时,你的JVM都会使用最新加入的优化技术
           -XX:+UseBiasedLocking               启用一个优化了的线程锁
           -XX:PermSize                                   设置非堆内存初始值
           XX:MaxPermSize                             设置最大非堆内存的大小
           -XX:+DisableExplicitGC                 在程序代码中不允许有显示的调用”System.gc()”。
           -XX:+UseParNewGC                     对年轻代采用多线程并行回收,这样收得快。
           -XX:+UseConcMarkSweepGC     即CMS gc,这一特性只有jdk1.5即后续版本才具有的功能,它使用的是gc估算触发和heap占用触发。
           -XX:MaxTenuringThreshold         设置垃圾最大年龄
           -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 启动收集

       tomcat性能优化

  • tomcat的server.xml配置优化

             1、关闭域名反查

          enableLookups="false"

             2、启用gzip压缩

        compression="on"
        compressionMinSize="2048"
        compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"

             3、设置utf-8编码

          URIEncoding="UTF-8" 

             4、启用NIO或apr
                   在<Connector 连接器中添加
                   protocol="org.apache.coyote.http11.Http11NioProtocol" /*使用NIO*/
                   或者
                   protocol="org.apache.coyote.http11.Http11AprProtocol" /*使用apr*/
             5、启用线程池  Executor

                   <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"

             6、tomcat的Connector性能优化

    <Connector 
       executor="tomcatThreadPool"        指定线程池
       port="80"                        端口号
       protocol="HTTP/1.1"                协议类型
       connectionTimeout="20000"        最大连接时间
       redirectPort="8443"                跳转端口        
       maxThreads="150" 创建的最多运行线程数 
       
       protocol="org.apache.coyote.http11.Http11NioProtocol"   启用NIO
       URIEncoding="UTF-8"            默认编码utf-8编码 
       useBodyEncodingForURI="true" 启用url编码
       minSpareThreads="25" 初始化创建的线程数
       maxSpareThreads="75" 最多能创建的线程数,一旦创建的线程超过这个值,Tomcat就会关闭不再需要socket线程.
       enableLookups="false" 关闭dns查询
       disableUploadTimeout="true" 上传是是否使用超时机制
       acceptCount="300"   指定当所有可以使用的处理请求的线程数都被使用时可以放到处理队列中的请求数,超过这个数的请求将不予处理
       compression="on"                输出压缩
       compressionMinSize="2048"    压缩输出内容大小
       compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"  压缩文件类型/>

            7、tomcat的Executor性能优化

    <Executor 
	name="tomcatThreadPool" 这个是线程池的名字,必须唯一
	daemon=""  守护进程执行
	namePrefix="catalina-exec-"线程的名字前缀
	minSpareThreads="25"	最小的保持活跃的线程数量
	maxIdleTime=""超过最小活跃线程数量的线程,如果空闲时间超过这个设置后,会被关别。默认是1分钟。
	maxQueueSize="" 在拒绝之前,会保存到队列当中,等待处理。  队列的最大长度为Integer.MAX_VALUE
	prestartminSpareThreads="" 
	maxThreads="200" 允许的最大线程池里的线程数量
        threadRenewalDelay="" 当线程停止后,如果有需要,会进行重建,为了避免多个线程,该设置可以检测是否有2个线程同时被创建,如果是,则会按照该参数,延迟指定时间创建。 如果拒绝,则线程不会被重建。
    />

  • Host支持域名别名

             修改/usr/local/tomcat/conf/server.xml

          <Host name="www.combao.cn"  appBase="/home/combao/webapps"
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/home/combao/logs"
               prefix="combao." suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" />
            <!-- 定义域名别名 -->
            <Alias>combao.cn</Alias>
        <Context path="" docBase="/home/combao/webapps/combao" reloadable="true" />
          </Host>
  •    安装Arp,有利于高并发

               需要安装APR 1.5.1, APR-util 1.5.4、APR-iconv 1.2.1

              下载地址 http://apr.apache.org/

               1、安装APR 1.5.1               

./configure
make && make install
make clean

               默认会安装在/usr/local/apr目录下

               2、安装APR-util 1.5.4

./configure --with-apr=/usr/local/apr/bin/apr-1-config --with-java-home=/usr/java/jdk1.7.0_02 --with-ssl=yes
make && make install
make clean
               3、安装APR-iconv 1.2.1

./configure --prefix=/usr/local/apr-iconv --with-apr=/usr/local/apr
make && make install
make clean

  • 安装并配置tomcat-native

             1、安装tomcat-native

cp cd /usr/local/tomcat/bin/tomcat-native.tar.gz /home/tomcat-native.tar.gz
tar -xzvf tomcat-native.tar.gz

cd /home/tomcat-native-1.1.22-src/jni/native/
./configure -with-apr=/usr/local/apr -with-java=/usr/java/jdk1.7.0_02
make && make-install
make clean

         2、修改server.xml的Connector

                   protocol="HTTP/1.1" 改为org.apache.coyote.http11.Http11AprProtocol

  • 配置tomcat启动引用apr安装路径

             若不对tomcat指定apr自定义安装路径,则tomcat会初始化默认的路径,导致日志出现INFO级别的错误

Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Oct 15, 2014 2:58:21 PM org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
Oct 15, 2014 2:58:21 PM org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
            修改/etc/init.d/tomcat,在问# OS specific support.  $var _must_ be set to either true or false.前面定义变量CATALINA_OPTS
        CATALINA_OPTS="-server 
                -Xms1024m 
                -Xmx1024m 
                -XX:NewRatio=3 
                -XX:PermSize=128m 
                -XX:MaxPermSize=256m 
                -Duser.country=US 
                -Duser.language=en 
                -Duser.timezone=Asia/Shanghai 
                -Dfile.encoding=UTF-8 
                -Dsun.jnu.encoding=UTF-8 
                -Dcom.sun.management.jmxremote=true 
                -Djava.library.path=/usr/local/apr/lib"

  •  修改manager管理账号tomcat-users.xml
     vi /usr/local/tomcat/tomcat-users.xml
     <user username="tomcat" password="password" roles="tomcat,manager-gui,admin-gui"/>
  •   禁止罗列文件列表
        修改conf/web.xml文件
        <init-param> 
          <param-name>listings</param-name>             
          <param-value>false</param-value>
        </init-param>
  •   tomcat日志配置

                1、访问日志配置

                       默认不启用访问日志,若要启用修改/usr/local/tomcat/conf/server.xml配置文件

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" />

                2、运行日志配置

                      默认的运行日志为info,为了控制tomcat日志大小,server,只有出错的时候才记录。关闭设置off

############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################

1catalina.org.apache.juli.FileHandler.level = OFF#SEVERE
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.FileHandler.prefix = catalina.

2localhost.org.apache.juli.FileHandler.level = OFF#SEVERE
2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.FileHandler.prefix = localhost.

3manager.org.apache.juli.FileHandler.level = OFF#SEVERE
3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
3manager.org.apache.juli.FileHandler.prefix = manager.

4host-manager.org.apache.juli.FileHandler.level = OFF#SEVERE
4host-manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
4host-manager.org.apache.juli.FileHandler.prefix = host-manager.

java.util.logging.ConsoleHandler.level = OFF#SEVERE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter


############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.FileHandler

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = 3manager.org.apache.juli.FileHandler

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].handlers = 4host-manager.org.apache.juli.FileHandler

# For example, set the org.apache.catalina.util.LifecycleBase logger to log
# each component that extends LifecycleBase changing state:
#org.apache.catalina.util.LifecycleBase.level = FINE

# To see debug messages in TldLocationsCache, uncomment the following line:
#org.apache.jasper.compiler.TldLocationsCache.level = FINE

     测试结果

    通过ab(apache benchmark官方提供的压力测试工具)指令进行网站并发测试

     参考资料 

   http://blog.163.com/drg_king/blog/static/1761515612012864140199/

   http://blog.chinaunix.net/uid-8504518-id-2030424.html
   http://tomcat.apache.org/tomcat-7.0-doc/config/http.html
   http://tomcat.apache.org/tomcat-7.0-doc/config/executor.html
   http://tomcat.apache.org/tomcat-7.0-doc/config/cluster.html
   http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

   http://kenwublog.com/docs/java6-jvm-options-chinese-edition.htm

   http://blog.ziki.cn/1095.html

   http://wenku.baidu.com/link?url=ewxV9IcGFG6on1CpCo__hfqBuLXHRcKvrvavOoz0-wWJXJsKp-E1pWOpXooRr863bcwVRn6EJv1U5Ch-kPJbzTmroBwUS50333FnY3gGQ9S


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值