• 【转】tomcat7性能调优


    注意:调优tomcat需要了解使用的tomcat是什么版本,随着tomcat版本发展有新参数引入,同时有旧参数废弃。本文档以tomcat7为例进行调优

    一. 线程池(Thread Pool)优化

    编辑“Tomcat安装目录/conf/server.xml”文件,找到如下内容

    <!--

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

            maxThreads="150" minSpareThreads="4"/>

    -->

    取消注释,参数做如下调整

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

            maxThreads="1000" minSpareThreads="25"        

            maxIdleTime="600000" acceptCount="500"/>

    参数说明

    name        这个是线程池的名字,必须唯一,默认即可,我们在后面的配置里要用到这个东西
    namePrefix    线程的名字前缀,用来标记线程名字的,这样每个线程就用这个前缀加上线程编号了,比如 catalina-exec-1 catalina-exec-2 
    maxThreads    线程池可以容纳的最大线程数,tomcat使用线程来处理接收的请求每一个线程处理一个请求,这个值决定了同时能够处理的最大请求数,缺省值为200
    minSpareThreads 最小的保持活跃的线程数量,缺省值为4(tomcat5有此参数,而tomcat6无此参数,到了tomcat7又重新使用此参数,顺便提下5和7中这两个参数含义并不相同有兴趣可以查看官方文档)
    maxIdleTime   关闭一个空闲线程之前允许空闲线程持续的时间,只有当前空闲线程数大于minSpareThread的值,才会关闭空闲线程
    acceptCount   当所有可用的请求处理线程都被使用的时候,连接请求队列的最大长度。当该队列满了以后的所有请求都被拒绝,缺省值为10

    顺便提下如下3个参数maxSpareThreads、maxProcessors和minProcessors

    maxSpareThreads:允许存在的空闲线程的最大数量,tomcat5及以前版本才有的参数,tomcat6和tomcat7均无此参数
    minProcessors:最小空闲连接线程数,用于提高系统处理性能
    maxProcessors:最大连接线程数,即并发处理的最大请求数
    maxProcessors和minProcessors是tomcat4才有的,tomcat5之后的版本均取消了这2个参数,tomcat4基本无人在用了吧,所以优化的时候别再把这2个参数加上了

    二. 连接器(Connector)优化

    编辑“Tomcat安装目录/conf/server.xml”文件,找到如下内容将其注释掉

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

               connectionTimeout="20000"

               redirectPort="8443" />

    再找到如下内容,取消注释

    <!--

    <Connector executor="tomcatThreadPool"

           port="8080" protocol="HTTP/1.1"

           connectionTimeout="20000"

           redirectPort="8443" />

    -->

    参数做如下调整

    <Connector executor="tomcatThreadPool"

           port="8080" protocol="HTTP/1.1"

           URIEncoding="UTF-8" enableLookups="false" disableUploadTimeout="true"

           connectionTimeout="20000" keepAliveTimeout="15000" maxKeepAliveRequests="1000"

           useURIValidationHack="false" compression="on" compressionMinSize="2048"

           compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"

           redirectPort="8443"/>

    AJP/1.3协议负责和其他HTTP服务器建立连接,监听的是8009端口,比如tomcat和apache或者iis集成时使用这个连接器,此时则需优化8009端口的Connector。

    <!-- Define an AJP 1.3 Connector on port 8009 -->

        <Connector port="8009" protocol="AJP/1.3"

                URIEncoding="UTF-8" enableLookups="false" disableUploadTimeout="true"

                connectionTimeout="20000" keepAliveTimeout="15000" maxKeepAliveRequests="1000"

                useURIValidationHack="false" compression="on" compressionMinSize="2048"

                compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"

                redirectPort="8443" />

    参数说明:

    executor="tomcatThreadPool" 在 Connector里指定使用共享线程池的名称
    port="8080" 指定服务器端要创建的端口号,并在这个端口监听来自客户端的请求
    protocol="HTTP/1.1" 负责建立HTTP连接,web应用通过浏览器访问tomcat服务器用的就是这个连接器,默认监听的是8080端口。所以我们优化的是8080端口的Connector
    URIEncoding="UTF-8" URI解码所使用的字符集,只影响GET请求的URI解码,不影响post的解码
    enableLookups="false" 禁用DNS查询,默认值为true,为了提高处理能力应设置为false
    disableUploadTimeout="true" 允许servlet container在一个servlet执行的时候,使用一个不同的,更长的连接超时。最终的结果是给servlet更长的时间以便完成其执行,或者在数据上载的时候更长的超时时间。如果没有指定默认为false
    connectionTimeout="20000" 在Connector接受一个连接以后,等待发生第一个请求的时间,单位毫秒。缺省值为60000(60秒)
    keepAliveTimeout="15000" 在一个长连接中2次请求之间的最大间隔时间,超过此时间连接断开,单位毫秒
    maxKeepAliveRequests="1000" 在server关闭连接之前,接受的HTTP请求的最大数目。如果该值设为1,会禁止HTTP/1.0保活,同时也会禁止HTTP/1.1保活和pipelining。如果没有指定默认值100。
    useURIValidationHack="false" 减少它对一些url的不必要的检查从而减省开销
    compression="on" 设为on开启Connector使用HTTP/1.1的GZIP压缩,可节省服务器带宽
    compressionMinSize="2048" 启用压缩的输出内容大小,这里面设置为2KB
    compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 压缩文件的类型
    redirectPort="8443" 如果Connector支持非SSL请求,在收到一个要求使用SSL传输的请求以后,Catalina会自动将该请求重定向到这里指定的端口号

    三. JAVA虚拟机(JVM)优化

    注意调优JVM需要了解使用的JDK是什么版本,随着JDK版本发展有新参数引入,同时有旧参数废弃。本文档以JDK7为例进行调优

    下图为JDK7及之前老JDK版本的JVM内存结构图,优化JVM前必须清楚它的内存结构,有兴趣可以多查资料了解,在此不做过多描述。

    JDK7的JVM内存由Heap(堆空间)和Perm(持久代)组成. 其中Heap = {Old + young = { Eden , from, to } }

    JDK8的JVM已经将Perm(持久代)从内存空间移除

    Linux平台,编辑“Tomcat安装目录/conf/catalina.sh”文件,该文件开头是一大段由#包裹的注释,在注释的最后添加如下内容

    export JAVA_OPTS="-server -Xms3072M -Xmx3072M -Xmn512M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=256M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled  -XX:+UseCMSCompactAtFullCollection -XX:CMSMaxAbortablePrecleanTime=5 -XX:+CMSClassUnloadingEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -Djava.awt.headless=true" 

    如果想要打印JVM运行日志信息,则可以再添加如下参数,-Xloggs指定日志路径

    -Xloggc:/path/jvm.log -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCDetails

    Windows平台,则编辑“Tomcat安装目录/conf/catalina.bat”文件

    set JAVA_OPTS=-server -Xms3072M -Xmx3072M -Xmn512M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=256M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled  -XX:+UseCMSCompactAtFullCollection -XX:CMSMaxAbortablePrecleanTime=5 -XX:+CMSClassUnloadingEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -Djava.awt.headless=true

    如果想要打印JVM运行日志信息,则可以再添加如下参数,-Xloggs指定日志路径

    -Xloggc:D:pathjvm.log -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCDetails

    参数说明:

    -server 指定JAVA虚拟机运行在server模式
    -Xms 初始Heap内存大小,本文档设置了3G,需要结合服务器CPU核数,内存总量等实际情况来设置合适数值,此值并非越大越好,过大将增加垃圾回收的压力
    -Xmx 最大Heap内存大小,本文档设置了3G,需要结合服务器CPU核数,内存总量等实际情况来设置合适数值,此值并非越大越好,过大将增加垃圾回收的压力
    -Xmn 新生代内存大小
    -Xss 每个线程的堆栈大小
    -XX:+AggressiveOpts 启用JVM开发团队最新的调优成果,例如:编译优化,偏向锁,并行老年代收集,JDK5.6后引入,JDK6默认开启
    -XX:+UseBiasedLocking 启用一个优化了的线程锁(偏向锁),JDK5.6后引入,JDK6默认开启
    -XX:PermSize 初始持久代内存大小,需要注意永久代在JDK8中被完全的移除了,永久代的参数-XX:PermSize和-XX:MaxPermSize也被移除了
    -XX:MaxPermSize 最大持久代内存大小,需要注意永久代在JDK8中被完全的移除了,永久代的参数-XX:PermSize和-XX:MaxPermSize也被移除了
    -XX:+DisableExplicitGC 禁止显示的调用System.gc()方法进行GC
    -XX:+UseConcMarkSweepGC 使用并发标记清除(CMS)垃圾收集器 它是对年老代进行垃圾收集的。CMS收集器通过多线程并发进行垃圾回收,尽量减少垃圾收集造成的停顿。采用这种垃圾收集器默认会开启-XX:+UseParNewGC参数对新生代使用Parallel GC(并行垃圾回收器)
    -XX:+UseParNewGC 新生代使用Parallel GC(并行垃圾回收器),如果老年代使用了CMS垃圾回收期,则新生代默认就是这种垃圾回收器
    -XX:+CMSParallelRemarkEnabled CMS垃圾回收器回收对象时,应用有2次停顿,第一次是初始标记,第二次是重新标记,开启并行remark可以降低重新标记停顿时间,
    -XX:+UseCMSCompactAtFullCollection CMS不会整理堆碎片,为了防止堆碎片引起full gc,设置此参数使CMS垃圾回收时进行合并碎片,开启这个选项一定程度上会影响性能
    -XX:CMSMaxAbortablePrecleanTime
    -XX:+CMSClassUnloadingEnabled 开启CMS回收持久代,避免Perm区满引起的full gc
    -XX:LargePageSizeInBytes 指定Java heap的分页页面大小
    -XX:+UseFastAccessorMethods 将get(),set()方法转成本地代码,默认开启
    -XX:+UseCMSInitiatingOccupancyOnly 只有达到-XX:CMSInitiatingOccupancyFraction指定的使用百分比才进行老年代的垃圾回收
    -XX:CMSInitiatingOccupancyFraction 指定老年代在使用了多少百分比空间时开始进行垃圾回收,JDK5默认68%,JDK6默认92%
    -Djava.awt.headless 解决J2EE工程中的图表工具在Linux/Unix环境下会导致图片显示不出来
    -Xloggc 指定JVM日志输出到文件
    -XX:+PrintGCDateStamps 打印GC发生的时间,JDK6和JDK7才支持,如果是JDK5请使用-XX:+PrintGCTimeStamps
    -XX:+PrintGCApplicationStoppedTime 打印GC造成应用停顿的时间
    -XX:+PrintGCApplicationConcurrentTime 打印GC时应用并发执行的时间
    -XX:+PrintGCDetails 打印GC详细信息

    四. 调整Tomcat Connector的运行模式

    首先大致了解Tomcat Connector的三种运行模式:bio、nio和apr

    bio

    bio(blocking I/O),顾名思义,即阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包)。Tomcat在默认情况下,就是以bio模式运行的。遗憾的是,就一般而言,bio模式是三种运行模式中性能最低的一种。我们可以通过Tomcat Manager来查看服务器的当前状态。

    nio

    nio(new I/O),是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。要让Tomcat以nio模式来运行也比较简单,我们只需要在Tomcat安装目录/conf/server.xml文件中将如下配置:

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

                   connectionTimeout="20000"

                   redirectPort="8443" />

    中的protocol属性值改为org.apache.coyote.http11.Http11NioProtocol即可

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

                   connectionTimeout="20000"

                   redirectPort="8443" />







    此时,我们就可以在Tomcat Manager中看到当前服务器状态页面的HTTP协议的Connector运行模式已经从http-bio-8080变成了

    apr

    apr(Apache Portable Runtime/Apache可移植运行时),是Apache HTTP服务器的支持库。你可以简单地理解为,Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能。 Tomcat apr也是在Tomcat上运行高并发应用的首选模式。如果我们的Tomcat不是在apr模式下运行,在启动Tomcat的时候,我们可以在日志信息中看到类似如下信息:

    2015-12-13 16:17:49 org.apache.catalina.core.AprLifecycleListener init

    信息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: xxx/xxx(这里是路径信息)






    Tomcat apr运行模式的配置是三种运行模式之中相对比较麻烦的一种。据官方文档所述,Tomcat apr模式需要安装以下三个组件:

         •  APR library[APR库]

         •  JNI wrappers for APR used by Tomcat (libtcnative) [在Windows操作系统上,就是一个名为tcnative-1.dll的动态链接库文件]

         •  OpenSSL libraries[OpenSSL库]

    Tomcat6.x从6.0.32开始以及Tomcat7.x从7.0.30开始,Windows版的Tomcat已经在bin目录下自带了tcnative-1.dll等文件,并且启动后默认就运行在apr模式下,因此对于Windows操作系统我们只需要下载最新版本的Tomcat直接使用即可。而Linux版的Tomcat在bin目录下自带的是tomcat-native.tar.gz,这个包是需要和APR库一起编译安装后才能使用的。

     
    APR安装方式
    在Window下安装(Tomcat7.0.30之前版本才需要安装)
    1. 首先下载最新版本的tcnative-1.dll,下载地址:http://archive.apache.org/dist/tomcat/tomcat-connectors/native/
     
    2. 本文档下载的文件是tomcat-native-1.2.2-win32-bin.zip,解压缩得到32bit和64bit2个tcnative-1.dll,根据实际操作系统位数将相应的tcnative-1.dll拷贝到TOMCAT_HOME/bin目录下,启动即可
     
    3. 验证是否启动
    看见类似这样的信息就证明 apr 已启动
    2015-12-13 15:17:05 org.apache.catalina.core.AprLifecycleListener init
    信息: Loaded APR based Apache Tomcat Native library 1.1.20.
    2015-12-13 15:17:05 org.apache.catalina.core.AprLifecycleListener init
    信息: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
    2015-12-13 15:17:05 org.apache.coyote.http11.Http11AprProtocol init









    在Linux下安装
    1. 下载所需的包
    apr/apr-iconv/apr-util的下载路径:http://apr.apache.org/download.cgi
    本文档下载的是软件是如下版本
    apr-1.5.2.tar.gz 
    apr-iconv-1.2.1.tar.gz 
    apr-util-1.5.4.tar.gz
     
    tomcat-native下载路径:http://archive.apache.org/dist/tomcat/tomcat-connectors/native
    本文档下载的是tomcat-native-1.2.2-src.tar.gz,如果是Tomcat7.0.30之后的版本也可到tomcat安装目录的bin下面找tomcat-native.tar.gz  
     
    2. 安装apr
    tar zxvf apr-1.5.2.tar
    cd apr-1.5.2
    ./configure --prefix=/usr/local/apr
    make
    make install








     
     
    3. 安装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


     
     
     
     
     
     
     
    4. 安装apr-util
    tar zxvf apr-util-1.5.4.tar.gz
    cd apr-util-1.5.4
    ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv/bin/apriconv
    make
    make install





     
     
     
    5. 安装tomcat-native
    注意:安装之前请检查openssl-devel是否安装,因为编译的时候添加了--with-ssl=yes选项,此选项需要openssl-devel支持,配好yum源通过yum install openssl-devel安装,当然如果不加这个选项也可不装openssl-devel。
     
    tar zxvf tomcat-native-1.2.2-src.tar.gz
    cd tomcat-native-1.2.2-src/native
    (如版本是tomcat-native-1.1.x-src.tar.gz 则路径是tomcat-native-1.1.x-src/jni/native)
    ./configure --with-apr=/usr/local/apr --with-java-home=/usr/java/jdk1.7.0_80 --with-ssl=yes
    make
    make install
     
     
     
     
     
     
     
     
     
    6. 添加环境变量
    编辑/etc/profile 在文件末尾处添加下面的变量 
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib   
    然后执行下面命令,使环境变量即时生效
    source /etc/profile
     
    或者修改tomcat启动脚本catalina.sh/cactalina.bat
    在文件中加入启动参数:
        JAVA_OPTS="$JAVA_OPTS -Djava.library.path=/usr/local/apr/lib"
    或者:
        CATALINA_OPTS="$CATALINA_OPTS -Djava.library.path=/usr/local/apr/lib"
     
    注意如果是windows平台请不要添加双引号。
     
    6. 验证
    看到类似这样的信息就证明 apr 启动成功了。
    Jul 20, 2011 15:27:32 PM org.apache.catalina.core.AprLifecycleListener init
    INFO: Loaded APR based Apache Tomcat Native library 1.1.20.



     也可以通过Tomcat Manager来查看服务器的当前状态
     
     
    五 后记
    本着严谨的态度想将这篇文档尽量向严谨靠拢,但本人水平有限,文中不妥之处还请读者留言斧正不胜感激!如能给读者带来帮助也不枉我写作此文档,需要申明本文档第四节参考引用了如下2篇博文在此一并对博主表示感谢。
    http://www.365mini.com/page/tomcat-connector-mode.htm
    http://pengranxiang.iteye.com/blog/1128905
  • 相关阅读:
    CentOS中的中文乱码问题的解决
    xml2config not found. Please check your libxml2 installation.
    yii数据库存储对象DAO
    linux常用svn命令
    通过rpm包安装、配置及卸载mysql的详细过程.
    php Undefined index和Undefined variable的解决方法
    【30篇突击 android】源码统计四
    【30篇突击 android】源码统计三
    Android 新手入门指导
    android 问题汇总系列之三
  • 原文地址:https://www.cnblogs.com/dsc65749924/p/6081432.html
Copyright © 2020-2023  润新知