性能优化
前言
- Tomcat 的运行依赖于 JVM,从虚拟机的角度把 Tomcat 的优化分为两部分:
- 外部环境调优 JVM
- Tomcat 自身调优
Tomcat JVM 优化
- $CATALINA_BASE/bin/catalina.sh
- 优化参数没有最佳实践,需根据实际环境进行微调 从而达到最佳性能
...
# OS specific support. $var _must_ be set to either true or false.
# 添加下面一行
JAVA_OPTS="-server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512M"
# 横着写报错:-Xms1024m: command not found
#JAVA_OPTS="-server
#-Xms1024m
#-Xmx1024m
#-XX:NewSize=512m
#-XX:MaxNewSize=512M"
...- 选项说明:
-server # VM运行在server工作模式,为在服务端最大化程序运行速度而优化
-client # VM运行在client工作模式,为客户端环境减少启动时间而优化
# 使用“java -version”可以查看当前工作模式
------------------------
-Xms1024m # 初始Heap大小,使用的最小内存
-Xmx1024m # Java heap最大值,使用的最大内存。经验: 设置Xms大小等于Xmx大小
-XX:NewSize=512m # 表示新生代初始内存的大小,应该小于 -Xms的值
-XX:MaxNewSize=512M # 表示新生代可被分配的内存的最大上限,应该小于 -Xmx的值
-XX:PermSize=1024m # 设定内存的永久保存区域,内存的永久保存区域,VM 存放Class 和 Meta信息,JVM在运行期间不会清除该区域
-XX:MaxPermSize=1024m # 设定最大内存的永久保存区域。经验: 设置PermSize大小等于MaxPermSize大小
-XX:+DisableExplicitGC # 自动将System.gc() 调用转换成一个空操作,即应用中调用System.gc()会变成一个空操作,避免程序员在代码里进行System.gc()这种危险操作。System.gc()除非是到了万不得也的情况下使用,都应该交给 JVM。- 验证:
ps aux|grep java- tomcat 782 1.4 8.5 2983740 170424 ? Sl 00:39 0:04 /usr/local/jdk/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512M -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
Tomcat 开启 JMX 监控
# vim /usr/local/tomcat/bin/catalina.sh
...
CATALINA_OPTS="${CATALINA_OPTS} -Djava.rmi.server.hostname=$(hostname -I | awk '{print $1}')"
#CATALINA_OPTS="${CATALINA_OPTS} -Djava.rmi.server.hostname=10.0.0.18"
CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote=true"
CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.port=12345"
CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.ssl=false"
CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.authenticate=false"
# 说明:
CATALINA_OPTS="${CATALINA_OPTS} -Djava.rmi.server.hostname=JMX_HOST" #tomcat(Java程序)运行主机的IP地址,如果要在多台主机运行可以采用变量的方式获取当前主机的IP:$(hostname -I | awk '{print $1}')"
CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote=true" #启动远程监控JMX
CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.port=JMX_PORT" #JMX监听的端口号,要和zabbix添加主机时候的端口一致即可
CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.ssl=false" #不启用ssl连接
CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.authenticate=false" #不启用授权Tomcat 运行模式优化
-
Tomcat的运行模式有: bio,nio, apr
-
一般使用nio模式,bio效率低,apr对系统配置有一些更高的要求
关键配置优化
- maxThreads: 最大线程数,默认是200,
- minspareThread: 最小活跃线程数,默认是25
- maxqueuesize: 最大等待队列个数
影响性能的配置
- compression 设置成on,开启压缩
- 禁用AJP连接器: 用nginx+Tomcat的架构,用不到AJP
- enableLookups=false 关闭反查域名,直接返回ip,提高效率
- disableUploadTimeou=false上传是否使用超时机制
- acceptCount=300 , 当前所有可以使用的处理请求都被使用时,传入请求连接最大队列长队,超过个数不予处理,默认是100
- keepalive timeout=120000 场链接保持时间