记录压测出现问题
现象
并发访问的时候,rt飙升。
小访问量时候rt 200ms,并发访问发现rt飙升 700-4000+ms。重启pod服务之后正常,访问N分钟之后就会出现rt飙高。之后rt 一直在700-4000+ms。
调查
看了表没有索引以为是数据库的索引性能导致,优化索引无效。查看数据库监控指标正常,排除数据库问题。
优化代码之后重启pod正常一下,突然又不行了。我认为是k8s 集群网络问题,调查了好长时间pod 访问数据库位网络问题。排除pod和数据网络问题。
通过JVisualVm 查看Pod jvm堆栈信息。发现survivor区回收不了,手动GC之后,rt又正常了。看了一下jvm参数,根本就没有配置jvm参数,只设置堆栈的大小。
survivor区回收不数据,然后手动执行了GC操作。发现rt恢复了。
添加JJVM 使用G1垃圾回收
1
2
3-XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -Xss256k -XX:+DisableExplicitGC \
-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:G1ReservePercent=10 \
-XX:InitiatingHeapOccupancyPercent=45 -XX:ConcGCThreads=2 \现在出现频繁yong gc,后面会继续优化G1垃圾回收器
优化
检索数据库优化
创建索引,索引使用覆盖索引,减少回表操作。
G1垃圾回收优化
本项目适当调整InitiatingHeapOccupancyPercent 、G1NewSizePercen和G1MaxNewSizePercent值比例。
-XX:InitiatingHeapOccupancyPercent:一般会简写IHOP,默认是45%,这个占比跟并发周期的启动相关,当空间占比达到这个值时,会启动并发周期。如果经常出现FullGC,可以调低该值,尽早的回收可以减少FullGC的触发,但如果过低,则并发阶段会更加频繁,降低应用的吞吐。
-XX:G1NewSizePercent:年轻代最小的堆空间占比,默认是5%。
-XX:G1MaxNewSizePercent:年轻代最大的堆空间占比,默认是60%。