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 clean3、安装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