一.tomcat优化方向
要优化调整tomcat,首先要知道决定性能的几个重要指标
1.吞吐量
2.Responsettime(响应时间)
3.Cpuload(cpu负载)
4.MemoryUsage(内存占用)
通过对tomcat的各种配置的调整,使其最优化上面4个核心指标的读数。解决了以下2点:
1) 承受更大并发用户数
2) 取得了良好的性能与改善
二.tomcat优化步骤
Tomcat的优化分成两块:
1.Tomcat启动命令行中的优化参数即JVM优化。
2.Tomcat容器自身参数的优化。
这一节先要讲的是Tomcat启动命令行中的优化参数。
Tomcat首先跑在JVM之上的,因为它的启动其实也只是一个java命令行,首先我们需要对这个JAVA的启动命令行进行调优。
三.Tomcat启动行参数的优化
Tomcat的启动行参数位于tomcat安装目录的bin文件夹下。在windows中文catalina.bat 。文件在linux系统下为catalina.sh文件。打开该文件,开头一般都是一堆注释文字。在其末尾处加入如下参数
Linux系统的tomcat启动参数
export JAVA_OPTS="-server -Xms1400M -Xmx1400M –Xmn512m-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 "
有些参数需要根据机器情况来填写相应的值下面
参数说明:
-server
Tomcat运行在生产环境中必加的选项,以server模式运行
-Xms –Xmx
即JVM的内存设置,将两个值设置成一样是最优化配置。设置最大值时用命令 java –Xmx1500m–version 来试试限制。能正常显示版本信息则为正常
-Xmn
设置年轻代的大小整个堆大小=年轻代大小+年老代大小+持久代大小。持久代一般固定64M 所以增大年轻大后,会减少年老代大小,对系统性能影响较大,官方推荐为整个堆的3/8.
-Xss
设置每个线程的堆栈大小,一般不要超过1M,要不然容易内存溢出
-XX :+AggressiveOpts
- 加入JDK动态升级,当JDK升级时tomcat也能获得最新技术的支持
XX :+UseBiasedLocking
启用一个优化的线程锁,使得appserver对内线程处理自动进行最优调配
-XX :PermSize=128M –XX:MaxPermSize=256M
Permsize设置非堆内存初始值,一般为物理内存的1/64
MaxPermSize设置最大非堆内存值,一般为物理内存的1/4
在数据量很大的文件导出时的必设项,否则可能导致内存溢出
-XX:+DisableExpllicitGC
在程序代码中不允许有显示的调用System.gc(),避免其导致的Full GC造成的JVM大起大落
-XX:+UseParNewGC
对年轻代采取多线程并行回收,加快回收速度
-XX:+UseConcMarkSweepGC
即CMS gc,这一特性只有jdk1.5即后续版本才具有的功能,它使用的是gc估算触发和heap占用触发。
我们知道频频繁的GC会造面JVM的大起大落从而影响到系统的效率,因此使用了CMS GC后可以在GC次数增多的情况下,每次GC的响应时间却很短,
-XX:MaxTenuringThreshold
设置垃圾最大年龄,设置为0的话,则年轻代不经过Survivor区,直接变为年老代,设置较大的值的话,可以增加对象在年轻代即回收的概率。具体值根据实际来设置
-XX:+CMSParallelRemarkEnabled
在使用UseParNewGC的情况下尽量减少Mark时间
-XX:+UseCMSCompactAtFullCollection
在使用concurrent gc 的情况下, 防止memoryfragmention, 对live object 进行整理, 使 memory 碎片减少。
-XX:+LargePageSizelnBytes=128m
指定 Java heap的分页页面的大小
-XX:+UseFastAccessorMethods
Get, set 方法转成本地代码
-XX:+UseCMSlnitiatingOccupancyOnly
指示只有在oldgeneration在使用了初始化比例后concurrent collector启动收集
-
-Djava.awt.headless=true
这个参数一般我们都是放在最后使用的,这全参数的作用是这样的,有时我们会在我们的J2EE工程中使用一些图表工具如:jfreechart,用于在web网页输出GIF/JPG等流,在winodws环境下,一般我们的app server在输出图形时不会碰到什么问题,但是在linux/unix环境下经常会碰到一个exception导致你在winodws开发环境下图片显示的好好可是在linux/unix下却显示不出来,因此加上这个参数以免避这样的情况出现。
上述的配置基本可以达到
1.系统响应时间增快
2.Jvm回收速度增快同时又不影响系统响应时间
3.Jvm内存最大化利用
4.线程阻塞情况最小化
四.Tomcat容器内的优化
前面对Tomcat启动时的命令进行了优化增加了系统JVM的可使用数,垃圾回收效率与线程阻塞情况,增加了系统响应效率等。还有一个很重要的指标没有优化——吞吐量。
打开tomcat安装目录/conf/server.xml后找到如下一行
这一行就是tomcat容器性能参数设置的地方,一般会有一个默认值,这些默认值是远远不够我们使用的。因此需要做如下的修改
URIEncoding="UTF-8" minSpareThreads="25"maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"connectionTimeout="20000"
acceptCount="300" maxThreads="300"maxProcessors="1000" minProcessors="5"
useURIValidationHack="false"
compression="on" compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
redirectPort="8443"
/>
参数说明
URIEncoding=“UTF-8”
使得tomcat可以解析含有中文名的文件的url
maxSpareThreads=“75”
空闲状态的线程数多于设置的数目,则将这些线程终止,减少这个池中的线程总数
minSpareThreads=”25”
最小备用线程数。Tomcat启动时的初始线程数。
EnableLookups=false
DNS寻找,设为关闭。
ConnectionTimeout=20000
为网络连接超时时间毫秒数
acceptCount=300
是当线程数达到maxThreads后,后续请求会被放入一个等待队列,这里设置的就是队列大小,如果这个也满了,就直接拒绝连接。
maxthreads=300
tomcat使用线程来处理接收数据的最大线程,即最大并发数。
maxProcessors=1000和mincessors=5
在 Java中线程是程序运行时的路径,是在一个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序员写出CPU最 大利用率的高效程序,使空闲时间保持最低,从而接受更多的请求。
通常Windows是1000个左右,Linux是2000个左右。
useURIValidationHack=false
可以减少对url的一些不必要的检查以减少开销。
给tomcat配置http压缩功能
HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程HTML,CSS,Javascript, Text ,它可以节省40%左右的流量。更为重要的是,它可以对动态生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等输出的网页也能进行压缩,压缩效率惊人。
1)compression="on"打开压缩功能
2)compressionMinSize="2048"启用压缩的输出内容大小,这里面默认为2KB
3)noCompressionUserAgents="gozilla,traviata" 对于以下的浏览器,不启用压缩
4)compressableMimeType="text/html,text/xml" 压缩类型
最后如果需要利用到https的话在可以在3端口也加上同样的配置。