自身参数调整(server.xml)

  1. 禁用AJP服务
  2. 设置线程池
  • 初始线程数 100 1000
  • 最大线程数(默认是200) 500 5000
  • 最大等待队列数(默认是100) 700

需要注意的是:单靠提升线程池数目不能直接提升性能,最大线程数提升到500,并发为1000时,错误率达到了50%,但响应时间缩短了,还是合理的,因为通常我们不能只使用一台Tomcat去服务,而是需要构建一个集群。

  1. 运行模式
  • 在Tomcat版本大于8时,推荐使用nio2模式,默认是nio模式

    优化配置

    1. <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
    2. maxThreads="600"
    3. minSpareThreads="100"
    4. maxSpareThreads="500"
    5. acceptCount="700"
    6. connectionTimeout="20000"
    7. redirctPort="8443" />

    优化配置终极版

    1. <Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
    2. URIEncoding="UTF-8"
    3. maxConnections="10000"
    4. maxThreads="2000"
    5. acceptCount="2000"
    6. minSpareThreads="100"
    7. compression="on"
    8. compressionMinSize="2048"
    9. compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
    10. enableLookups="false"
    11. disableUploadTimeout="true"
    12. connectionTimeout="true"
    13. connectionTimeout="20000"
    14. redirctPort="8443" />

    自身参数详解(server.xml)

  1. maxSpareThreads Tomcat初始化时创建的线程数,最小备用线程数,一旦创建的线程超过这个值,Tomcat就会关闭不需要的socket线程。
  2. enableLookups=”false” 是否使用DNS反查域名,为提高处理能力,设置为false。如果需要request.getRemoteHost()进行DNS查询,以返回远程客户端的实际主机名,才需要设置为true。
  3. disableUploadTimeout=true 没传完时不要设置超时。
  4. connectiontimeout=-1 永不超时,呼死你。
  5. acceptCount 是当线程数达到maxThreads后,后续请求会被放入一个等待队列,这个acceptCount是这个队列的大小,如果这个队列也满了,就直接拒绝连接。
  6. maxThreads 最大线程数,即同时处理的任务个数,默认值为200,推荐设置600 ~ 900。
  7. minProcessors 最小的处理线程数 即使没有HTTP请求,TOMCAT也保持这么多线程等待处理。
  8. maxProcessors 最大的处理线程数,如果系统中已经有这个数字的线程,那么,更多的连接将进入排队(acceptCount)
  9. useURIValidationHack 减少它对一些url的不必要的检查从而减少开销,为提高性能可设置为false。
  10. compression 压缩
  11. compressionMinSize 压缩最小大小 1k
  12. compressableMimeType 压缩类型

    指定JDK路径动态配置(当系统安装有多个JDK时)

    1. set JAVA_HOME=D:\Program Files\Java\jdk1.7_64\jdk1.7.0_67_x64

    设置session-timeout的值(分钟)

    1. <session-config>
    2. <session-timeout>30</session-timeout>
    3. </session-config>

    JVM参数调整(JAVA_OPTS)

  13. 设置并行垃圾回收器

年轻代、老年代均使用并行收集器。添加下列参数并放入catalina.sh

  1. JAVA_OPTS="-XX:+UseParallelGC -XX:+UseParalleOldGC -Xms64m -Xmx512m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"
  1. 调整年轻代大小(根据gc日志)

    1. JAVA_OPTS="-XX:+UseParallelGC -XX:+UseParallelOldGC -Xms128m -Xmx1024m -XX:NewSize=64m -XX:MaxNewSize=256m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"
  2. 设置G1垃圾回收器

G1是我们推荐的垃圾收集器

  1. JAVA_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -Xms128m -Xmx1024m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"

代码优化

  1. 尽可能使用局部变量
  2. 尽量减少对变量的重复计算
  3. 尽量使用懒加载的策略,即在需要的时候才创建
  4. 不要创建不使用的对象和导入不使用的类
  5. 不要手动GC
  6. String少使用正则
  7. 日志的输出注意日志级别

    三种工作模式

  • bio

bio.PNG

  • nio

nio.PNG

  • apr 要先安装apr及相关组件再安装Tomcat 4000 ~ 5000以上并发没问题 10倍性能

APR.PNG
bio 阻塞型io,最大并发数200

启动优化-内存优化

  1. export JAVA_OPTS="-server -Xms1600M -Xmx1600M -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"

查看堆内存(java内存映射命令)

  1. jmap -head $pid

参数解释

  1. -server # 启用jdk的server版,生产环境中必须加,将拥有更高的并发,更快更强的JVM垃圾回收机制
  2. -Xms -Xmx # 要么不设置,要么一样大,理由就一个:避免内存的忽高忽低
  3. -Xss # 指定每个线程的栈大小。一般设置不超过1M,不然容易OOM
  4. -XX:+AggressiveOpts # jdk自带的魔法属性,将最新版jdk优化特性自动注入
  5. -XX:+UseBiasedLocking # 启用了一个优化的线程锁,对于长短不一的请求,出现阻塞、排队现象,它自己优化
  6. -XX:MaxNewSize 设置最大的年轻代大小,默认是16M(可以设置,但尽量不设置)
  7. -XX:NewSize 设置年轻代大小(可以设置,但尽量不设置)
  8. -XX:+DisableExplicitGC 不要System.gc()
  9. -XX:MaxTenuringThreshold=31 生产OOM风险急剧降低