您的位置:首页 > 运维架构 > Tomcat

Tomcat性能优化

2014-09-29 13:49 204 查看

JVM性能优化

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

export J***A_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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: