通过 JMeter 对 Tomcat 增加压力,调整虚拟机参数达到调优效果,增加吞吐量
tomcat7,jdk7,jmeter3.1,一个web网站
配置线程数
10 个线程循环 1000 次
配置 HTTP 请求
配置观察结果
配置聚合报告
吞吐量,一秒钟 141.2 个请求
在 tomcat 的 catalina.sh 添加
JAVA_OPTS="-Xloggc:gc.log -XX:+PrintGCDetails -Xmx100M -Xms32M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseSerialGC"
tomcat 日志
限制堆初始32M,最大 100M,GC 初始日志
Java HotSpot(TM) 64-Bit Server VM (25.0-b70) for bsd-amd64 JRE (1.8.0-b132), built on Mar 4 2014 03:11:43 by "java_re" with gcc 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00) Memory: 4k page, physical 8388608k(288540k free) /proc/meminfo: CommandLine flags: -XX:+HeapDumpOnOutOfMemoryError -XX:InitialHeapSize=33554432 -XX:MaxHeapSize=104857600 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseSerialGC
Jmeter 运行结果
JMeter运行过程中GC日志
结果吞吐量 57,在 JMeter 运行过程中不断发生 FULL GC 并且消耗的时间还挺长的,严重影响了应用程序的吞吐量
把原来的 100M 堆,扩大到 512M
在 tomcat 的 catalina.sh 添加
JAVA_OPTS="-Xloggc:gc.log -XX:+PrintGCDetails -Xmx512M -XX:+HeapDumpOnOutOfMemoryError "
JMeter 运行结果
GC 日志
可以看出吞吐量319,性能增加了好几倍,其中 FULL GC 明显减少,大大提高了应用程序的性能
上面不加初始堆的情况下,可见堆空间维持在 200M 样子,所以设置初始的堆大小 200M,有利于减少 GC 次数
在 tomcat 的 catalina.sh 添加
JAVA_OPTS="-Xloggc:gc.log -XX:+PrintGCDetails -Xmx512M -Xms200M -XX:+HeapDumpOnOutOfMemoryError "
JMeter 运行结果
GC 日志
可以看到减少了 GC 次数,应用程序的吞吐量达到了450次/秒
前面用的串行回收器,这次换一个并行的回收器,线程数为 4
在 tomcat 的 catalina.sh 添加
JAVA_OPTS="-Xloggc:gc.log -XX:+PrintGCDetails -Xmx512M -Xms200M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParallelGC -XX:+UseParallelOldGC -XX:ParallelGCThreads=4"
JMeter 运行结果
GC 日志
由于 GC 压力并不大,所以改成并行回收器,吞吐量并没有改善
减少堆空间大小,看下串行回收器的效果
在 tomcat 的 catalina.sh 添加
JAVA_OPTS="-Xloggc:gc.log -XX:+PrintGCDetails -Xmx100M -Xms100M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseSerialGC"
JMeter 运行结果
GC 日志
可见串行的回收器大量的 GC 日志,吞吐量大量减少,吞吐量 74
和上面同样的方案,只是换用并行的回收器,看下效果(ParallelGCThreads=4 本机是 4 核的)
在 tomcat 的 catalina.sh 添加
JAVA_OPTS="-Xloggc:gc.log -XX:+PrintGCDetails -Xmx100M -Xms100M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParallelOldGC -XX:ParallelGCThreads=4"
JMeter 运行结果
GC 日志
可见并行回收器的 GC 日志大量减少,吞吐量相比串行提升了一倍
使用 ParNew回收器代替ParallelOldGC,这样老年代依然串行,新生代并行
在 tomcat 的 catalina.sh 添加
JAVA_OPTS="-Xloggc:gc.log -XX:+PrintGCDetails -Xmx100M -Xms100M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParNewGC"
JMeter 运行结果
GC 日志
吞吐量73 比新生代、老年代都串行的要高一点
使用 JDK11 代替原来的 JDK7,参数和上面的一致
在 tomcat 的 catalina.sh 添加
JAVA_OPTS="-Xloggc:gc.log -XX:+PrintGCDetails -Xmx100M -Xms100M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParNewGC"
JMeter 运行结果
GC 日志
吞吐量75 比上面的要高一点,可见简单的升级虚拟机版本也可以得到性能的提升