史上最强Tomcat8性能优化(下)( 三 )


连接器最佳实践此最佳配置仅供参考
调整JVM参数进行优化接下来 , 通过设置jvm参数进行优化 , 为了测试一致性 , 依然将最大线程数设置为500 , 启用nio2运行模式
设置并行垃圾回收器在/bin/catalina.sh文件第一行添加如下参数 , gc日志输出到/logs/gc.log
#年轻代、老年代均使用并行收集器 , 初始堆内存64M , 最大堆内存512MJAVA_OPTS="-XX:+UseParallelGC -XX:+UseParallelOldGC -Xms64m -Xmx512m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"
史上最强Tomcat8性能优化(下)文章插图
测试结果与默认的JVM参数结果接近 。
查看gc日志文件将gc.log文件上传到gceasy.io查看gc中是否存在问题 。 上传文件后需要等待一段时间 , 需要耐心等待 。
史上最强Tomcat8性能优化(下)文章插图
问题一:系统所消耗的时间大于用户时间
史上最强Tomcat8性能优化(下)文章插图
如果在报告中显示System Time greater than User Time , 系统所消耗的时间大于用户时间 , 这反应出的服务器的性能存在瓶颈 , 调度CPU等资源所消耗的时间要长一些 。
问题二:线程暂停时间有点长
史上最强Tomcat8性能优化(下)文章插图
可以关键指标中可以看出 , 吞吐量表现不错 , 但是gc时 , 线程的暂停时间稍有点长 。
【史上最强Tomcat8性能优化(下)】问题三:GC总次数过多
史上最强Tomcat8性能优化(下)文章插图
通过GC的统计可以看出:

  • 年轻代的gc有100次 , 次数有点多 , 说明年轻代设置的大小不合适 , 需要调整
  • FullGC有7次 , 说明堆内存的大小不合适 , 需要调整
问题四:年轻代内存不足导致GC
史上最强Tomcat8性能优化(下)文章插图
从GC原因的可以看出 , 年轻代大小设置不合理 , 导致了多次GC 。
调整年轻代大小调整jvm配置参数
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"将初始堆大小设置为128m , 最大为1024m , 初始年轻代大小64m , 年轻代最大256m
史上最强Tomcat8性能优化(下)文章插图
从测试结果来看 , 吞吐量以及响应时间均有提升 。
查看gc日志
史上最强Tomcat8性能优化(下)文章插图
可以看到GC次数要明显减少 , 说明调整是有效的 。
史上最强Tomcat8性能优化(下)文章插图
GC次数有所减少
史上最强Tomcat8性能优化(下)文章插图
设置G1垃圾回收器#设置了最大停顿时间100毫秒 , 初始堆内存128m , 最大堆内存1024mJAVA_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -Xms128m -Xmx1024m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"测试结果
史上最强Tomcat8性能优化(下)文章插图
可以看到 , 吞吐量有所提升 , 评价响应时间也有所缩短 。
史上最强Tomcat8性能优化(下)文章插图
G1集合阶段统计
史上最强Tomcat8性能优化(下)文章插图
JVM配置最佳实践此最佳配置仅供参考
JAVA_OPTS="-Dfile.encoding=UTF-8-server -Xms1024m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=1024m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=10-XX:NewRatio=2 -XX:+DisableExplicitGC"参数说明:
file.encoding 默认文件编码
-Xmx1024m 设置JVM最大可用内存为1024MB
-Xms1024m 设置JVM最小内存为1024m 。 此值可以设置与-Xmx相同 , 以避免每次垃圾回收完成后JVM重新分配内存 。
-XX:NewSize 设置年轻代大小
-XX:MaxNewSize 设置最大的年轻代大小