性能优化

前言

  • 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 场链接保持时间