Tomcat默认参数一般很难满足生产环境,同样也不适用于性能测试环境,所以需要根据实际情况修改一下参数。下面以真实项目的性能测试环境配置为例,简单介绍下Tomcat配置参数的优化。
先上两幅图,是关于Tomcat 配置文件server.xml中部分内容的截图。图1来源于项目A的性能测试环境,图2来源于项目B的性能测试环境。其中项目B的tomcat配置已经做了相关优化。(使用的都是tomcat6)
图1
图2
优化一:使用线程池
首先说下图1中有个明显的问题:线程池的配置没有生效。
Tomcat 默认配置中Excutor那一段其实是被注释了的,虽然图1把注释去掉了,但是在Connector中没有指定executor属性。如图2所示
使用线程池的目的是用较少的线程处理较多的访问,能够提供Tomcat的处理请求能力。
优化二:线程数设置
两幅图里都进行了线程数相关参数的设置,如下:
maxThreads:可用于请求处理的最大线程数,默认是200。
minSpareThreads:初始线程数,即最小空闲线程数,默认是25。
acceptCount:当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,默认100。
另外图2还做了些其他优化,相关参数含义如下:
enableLookups:是否允许DNS查询。为了提高处理能力,应设置为false 。当web应用程序向要记录客户端的信息时,它也会记录客户端的IP地址或者通过域名服务器查找机器名转换为IP地址。DNS查询需要占用网络,并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的IP的过程,这样会消耗一定的时间。
disableUploadTimeout:这个标志允许servletcontainer在一个servlet执行的时候,使用一个不同的,更长的连接超时。最终的结果是给servlet更长的时间以便完成其执行,或者在数据上载的时候更长的超时时间。如果没有指定,设为false。
compression:是否启用压缩 on为启用(文本数据压缩)off为不启用, force 压缩所有数据。 当网站从服器端请求的数据较大时,在有限的带宽下就会造成浏览器加载缓慢,有时候会造成页面没有响应,使用户体验变得很差,tomcat为我们提供了有效的解决了办法,就是使用压缩来解决传输问题。有人指出(未验证正确性),如果是Tomcat 6/7, (影响最新Tomcat 7.0.29)需要在Connector里面加上:useSendfile=”false”否则大于compressionMinSize的文件不会压缩。
compressionMinSize:当超过最小数据大小才进行压缩
compressableMimeType:配置想压缩的数据类型
其他参数说明
URIEncoding:指定Tomcat容器的URL编码格式。
connnectionTimeout:网络连接超时,单位:毫秒;设置为0表示永不超时,通常可设置为30000毫秒。
另外需要说明的是图2中的参数minProcessors和maxProcessors其实在Tomcat4以上版本就不再用了,所以在这里设置是没有用的。
优化三:内存优化
示例:Linux中,在catalina.sh中添加
JAVA_OPTS='-Xms4096m -Xmx4096m -XX:PermSize=512m -XX:MaxPermSize=1024m
-Xloggc:../logs/gc.log -XX:+PrintGCDetails -XX:+PrintHeapAtGC
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.propertie'
参数含义:
-Xms:虚拟机初始化时的最小堆内存
-Xmx:虚拟机可使用的最大堆内存
-XX:PermSize:设置持久代(perm gen)初始值
-XX:MaxPermSize:设置持久代最大值
-Xloggc:filename把相关日志信息记录到文件以便分析
-XX:+PrintGCDetails 打印GC细节
-XX:+PrintHeapAtGC 打印GC前后的详细堆栈信息
Tomcat默认可以使用的内存为128MB,一般生产环境中内存需要调大,而内存大小设置需要视具体情况而定。-Xms与-Xmx最好设成一样,避免在每次GC后调整堆的大小。
优化四:IO模式设置
Tomcat存在3种IO模式,分别为:BIO,NIO,APR。
BIO:一个线程处理一个请求。缺点:并发量高时,线程数较多,浪费资源。Tomcat7或以下在Linux系统中默认使用这种方式。
NIO:利用Java的异步IO处理,可以通过少量的线程处理大量的请求。Tomcat8在Linux系统中默认使用这种方式。开启也很简单,server.xml修改一下再重启tomcat即可:
APR:从操作系统层面解决io阻塞问题。配置修改:
需要下载APR模式需要的库,因为这种模式是基于JNI的,即JAVA调用本地库的方式来进行IO。Linux如果安装了apr和native,Tomcat直接启动就支持apr。apr安装可参考http://www.cnblogs.com/wjoyxt/p/3998221.html
参考:
http://www.importnew.com/16462.html
https://yq.aliyun.com/articles/60757
http://www.cnblogs.com/ggjucheng/archive/2013/04/16/3024731.html
http://www.cnblogs.com/springside6/archive/2012/03/12/2525111.html
公众号:itest_forever
CSDN:http://blog.csdn.net/itest_2016
QQ群:274166295(爱测未来2群)、610934609(爱测未来3群)