G1并发执行的线程数对性能的影响
# G1并发执行的线程数对性能的影响
优化案例1中,Tomcat 使用的垃圾回收器是ParallelGC,这个案例更改为G1(Linux虚拟机更改为4核、8G)。尝试说明G1并发执行的线程数对性能的影响。
# 案例演示
初始Tomcat JVM参数设置(setenv.sh
文件):
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UseG1GC"
export CATALINA_OPTS="$CATALINA_OPTS -Xms20m"
export CATALINA_OPTS="$CATALINA_OPTS -XX:SurvivorRatio=8"
export CATALINA_OPTS="$CATALINA_OPTS -Xmx20m"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+PrintGCDetails"
export CATALINA_OPTS="$CATALINA_OPTS -XX:MetaspaceSize=64m"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+PrintGCDateStamps"
export CATALINA_OPTS="$CATALINA_OPTS -Xloggc:/home/wenwl/apache-tomcat-8.5.66/logs/gc.log"
export CATALINA_OPTS="$CATALINA_OPTS -XX:ConcGCThreads=1"
其中参数-XX:ConcGCThreads=1
可以在使用G1 GC 测试初始并发GC Threads之后再加上,因为没有配置的情况下:并发线程数是1。
初始化内存和最大内存调整小一些,目的发生 FullGC,关注GC时间 。
案例关注点是:GC次数,GC时间,以及Jmeter的平均响应时间。
# 初始状态
启动Tomcat后,查看进程默认的并发线程数(ConcGCThreads),默认为1:
使用jstat
,查看压测前后JVM统计信息:
由上图可知,压力测试期间,YGC的次数为735次(750 - 15),时间为 1.983秒(2.057 - 0.074),每次YGC平均耗时 2.69ms;
期间没有发生1次过Full GC;GC总时间为1.983秒。
接下来关注压测数据:
由上图可知,90%的请求响应时间为23ms,95%的请求响应时间为36ms,95%的请求响应时间为69ms,吞吐量为4737.5/sec。
# 优化之后
根据之前G1的参数介绍,将并发线程设置为2,并重启Tomcat之后测试。
export CATALINA_OPTS="$CATALINA_OPTS -XX:ConcGCThreads=2"
使用jstat
,查看优化后的压测前后JVM统计信息:
由上图可知,压力测试期间,YGC的次数为669次(687 - 9),时间为 1.786秒(1.831 - 0.045),每次YGC平均耗时 2.66ms;
期间发生过1次 Full GC;GC总时间为 1.814秒。
接下来关注优化后压测数据:
由上图可知,90%的请求响应时间为22ms,95%的请求响应时间为34ms,99%的请求响应时间为64ms,吞吐量为4880.9/sec。
# 总结
总的来说,增加了G1并发线程数之后,由于GC总时间略微下降的,平均吞吐量有略微提升,特别是在90%、95%、99%的平均响应时间有明显下降。仅从效果上来看,我们这次的优化是有一定效果的。在工作中对于线上项目进行优化的时候,可以考虑到这方面的优化。 此外,注意G1垃圾收集器是在大内存应用上则发挥其优势,平衡点在6-8GB之间。