一.Jvm虚拟机参数优化
Tomcat虚拟机参数配置在{CATALINA_HOME}/bin/setvmargs.sh中
在对应JDK的设置语句参数中,进行如下优化:
1.提高Xms与Xmx两个值的大小,并保证他们设成一样,这是最优的做法
初始值都是1024m,在足够空间的情况下建议提高到4096m或者更高
2.增加并行垃圾收集器的线程数量,提高回收效率
在-XX:+UseParallelGC参数后面增加一个-XX:ParallelGCThreads=n的参数
配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。
n值建议配置成和环境上的逻辑cpu数目相同
3.在允许的情况下去除GC日志的打印,减少额外的性能消耗
在文件中注释掉一些内容:
【JDK 1.8】
JAVA_OPTS="$JAVA_OPTS "-Xloggc:$CATALINA_BASE/logs/gc.log
JAVA_OPTS="$JAVA_OPTS "-XX:+PrintGCDetails
JAVA_OPTS="$JAVA_OPTS "-XX:+UseGCLogFileRotation" "-XX:NumberOfGCLogFiles=10" "-XX:GCLogFileSize=10M
【JDK 1.6/1.7】
JAVA_OPTS="$JAVA_OPTS "-Xloggc:$CATALINA_BASE/logs/gc.log" "-XX:+PrintGCDetails
二、修改OpenAS Tomcat的日志级别
修改{CATALINA_BASE}/conf/log4j.xml中所有的日志级别为ERROR(必要时可设置成OFF),以增加性能
三、Tomcat connector**端口配置优化
在{CATALINA_BASE}/conf/server.xml中进行优化
1.确保所有connector使用的是NIO模式而不是BIO模式
2.在对应的http/https对应的connector中,提高以下属性的值
maxThreads:最多同时处理连接的线程数,Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。如果没有指定,该属性默认值被设置为200。可以配置成1000或者更高
acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。默认值是100,可以配置成500或者更高
minSpareThreads:始终保持运行最小线程数。如果没有指定,则默认为10,可以适当提高以提高请求激增时的响应速度,可以设置成100或者更高
备注:
maxThreads和acceptCount并不是简单的设置的越大越好,比如增加maxThreads的值的同时会增加并发的线程,这是会消耗资源的,当然我们不仅仅是从系统资源消耗的角度看。影响CPU性能的主要有两个因素:计算和等待。如果你的业务模型是大量计算占据主要处理周期,那maxThreads应该减少设置,通过降低并行Thread数量,减少任务切换次数,提高单个Thread的处理时长(这里的处理时长不是操作系统的分时处理时间,只是相对提高Thread的处理时间和轮询机会),来达到性能最优;如果你的业务模型是等待(如I/O访问、网络访问、数据库访问等),那提高maxThreads的设置,让系统整体的等待尽可能分散到更多的线程上,提高并发接续能力,可能就更加合适一些。当然,一旦并发的线程变多,任务切换的成本就会增加,负向影响会逐渐增加,突破平衡后,即使接续了,但却处理超时了,因为系统的处理能力就那么多。所以这段话就是要说明一个度的原则,可能需要不断的测试、调整和优化。
maxConnections这个配置容易和maxThreads引起混淆,前者是Tomcat和外部请求能够建立连接数目的最大值,后者是Tomcat能够同时处理请求的线程数的最大值,具体的区别可以参考本人的另一篇文章:
http://3ms.huawei.com/hi/blog/585981_2043627.html
而在NIO模式下,maxConnections这个默认配置已经足够大(10000),所以一般不用去修改这个配置
3.启用compression
Tomcat是支持实时压缩的,HTTP压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程HTML,CSS,Javascript,Text,它可以节省很多的流量。更为重要的是,它可以对动态生成的,包括CGI、PHP、JSP、ASP、Servlet、SHTML等输出的网页也能进行压缩,压缩效率惊人。在Connector里面配置compression="on"就打开了压缩。压缩有助于减少客户端的下载,提高客户端的响应速度,在比拼和实际应用中都具有很大的价值。
但是压缩带来的问题就是对CPU的消耗,众所周知压缩算法对CPU的消耗是巨大的,所以不建议对所有的内容开启压缩,而是配置在大于一定大小的响应内容的情况下才开启压缩(请参考compressionMinSize参数)
当compression启用的时候还可以配置noCompressionUserAgents、compressionMinSize和compressableMimeType,配置哪些UA不使用压缩,和哪些返回的类型使用压缩,以及最小文本压缩范围。
例子如下:
1)compression="on" 打开压缩功能
2)compressionMinSize="2048" 启用压缩的输出内容大小,这里面默认为2KB(2048),小于这个值的响应内容将不启用压缩,建议配置的大一点如8KB或者更高
3)noCompressionUserAgents="gozilla, traviata" 该值是一个正则表达式(使用java.util.regex),匹配不应该使用压缩的HTTP客户端的用户代理标头,对于配置的匹配的浏览器,不启用压缩,默认值是空字符串
4)compressableMimeType="text/html,text/xml" 该值是一个被用于HTTP压缩的逗号分隔的MIME类型列表,默认值是text / html类型
四、增加Tomcat集群中的Tomcat数目,将压力负载分担到更多的Tomcat上,以提升整体系统的性能。
五、Tomcat应用服务器前端挂载反向代理服务器,开启负载均衡,并启用缓存静态资源,使整个系统动静态资源分离,从而加速处理用户请求