nginx+keepalived+tomcat之tomcat性能调优

‍tomcat容器调优

vim $CATALINA_HOME/conf/server.xml

...

<Connector port="8080" protocol="HTTP/1.1"

URIEncoding="UTF-8" minSpareThreads="25" maxSpareThreads="75"

enableLookups="false" disableUploadTimeout="true" connectionTimeout="20000"

acceptCount="500" maxThreads="300"

useURIValidationHack="false"

compression="on" compressionMinSize="2048"

compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"

redirectPort="8443"

/>

...

【注释】

URIEncoding:URI编码,这里参数是UTF-8,很容易理解,即支持中文域名

minSpareThreads:最小空闲线程,即tomcat可以保留的最小线程

|--> maxSpareThreads:最大空闲进程,如果超出这个参数,则会被回收

(这两个参数根据实际环境而定,如果每天都有一个并发爆发期,则最好min设置的大一些)

enableLookups:是否开启域名解析,这个一般都禁止,域名解析影响性能

disableUploadTimeout:

connectionTimeout:连接超时时间,单位是ms,根据程序性能决定

maxThreads:同一时刻可以接收的最大请求,即并发量

acceptCount:若超出maxThreads,则超出部分不能超过此参数值,若超过,则拒绝

useURIValidationHack:设置为false可以减少tomcat对一些url的不必要的检查从而减省开销【不明觉厉】

compression:是否启用压缩,肯定启用了

compressionMinSize:压缩文件大小下限,单位字节

compressableMimeType:压缩文件的Mime类型

redirectPort:重定向(因此若为443https,则8443 connector也应该加入以上参数)


jvm调优

vim $CATALINA_HOME/bin/catalina.sh

...

export JAVA_OPTS="-server -Xms8192M -Xmx8192M -Xmn3072M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=256M -XX:MaxPermSize=4096M -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调优其实就是在catalina启动时临时加上JAVA_OPTS变量值的。

-server:意思就是将tomcat改为生产模式,这个看网上说明,不加的话,就如同实验环境一样。因此,必加参数

-Xms:jvm最小堆内存

|--> -Xmx:jvm最大堆内存

这两个值的差值叫做保留内存,不过建议最好设置的一样,即最小内存随同最大内存,之所以这么设置是因为,内存回收的时候,也是需要消耗cpu的,如果此时突然并发又来了,而tomcat却在回收内存,那么就不爽了

-Xmn:新生态内存,这个官方建议是jvm堆内存的3/8,堆内存=新生内存+老年内存+持久内存

-Xss:设定每个线程的堆栈大小

-XX:+AggressiveOpts:作用如其名(aggressive),启用这个参数,则每当JDK版本升级时,你的JVM都会使用最新加入的优化技术

-XX:+UseBiasedLocking:启用一个优化了的线程锁,我们知道在我们的appserver,每个http请求就是一个线程,有的请求短有的请求长,就会有请求排队的现象,甚至还会出现线程阻塞,这个优化了的线程锁使得你的appserver内对线程处理自动进行最优调配。

-XX:PermSize:持久态最小内存,默认为物理内存大小的1/64

-XX:MaxPermSize:持久态最大内存,默认为物理内存大小的1/4

-XX:+DisableExplicitGC:在程序代码中不允许有显示的调用”System.gc()”,【不明觉厉】

-XX:MaxTenuringThreshold:设置对象在年轻态停留的时间,时间越长,被回收概率越大,若为0,则直接转到老年态

-XX:+UseConcMarkSweepGC:CMS gc,这一特性只有jdk1.5即后续版本才具有的功能,它使用的是gc估算触发和heap占用触发。

我们知道频频繁的GC会造面JVM的大起大落从而影响到系统的效率,因此使用了CMS GC后可以在GC次数增多的情况下,每次GC的响应时间却很短,比如说使用了CMS GC后经过jprofiler的观察,GC被触发次数非常多,而每次GC耗时仅为几毫秒。【不明觉厉】

-XX:+UseParNewGC:年轻代采用多线程并行回收,加速回收

|--> -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 启动收集【不知道啥意思】

-Djava.awt.headless=true":这个参数一般我们都是放在最后使用的,这全参数的作用是这样的,有时我们会在我们的J2EE工程中使用一些图表工具如:jfreechart,用于在 web网页输出GIF/JPG等流,在winodws环境下,一般我们的app server在输出图形时不会碰到什么问题,但是在linux/unix环境下经常会碰到一个exception导致你在winodws开发环境下图片显 示的好好可是在linux/unix下却显示不出来,因此加上这个参数以免避这样的情况出现。【虽然知道结果,就是不知道因在何处】

来自为知笔记(Wiz)