现象

并发访问的时候,rt飙升。小访问量时候rt 200ms,并发访问发现rt飙升 700-4000+ms。重启pod服务之后正常,访问N分钟之后就会出现rt飙高。之后rt 一直在700-4000+ms。

调查

  1. 看了表没有索引以为是数据库的索引性能导致,优化索引无效。查看数据库监控指标正常,排除数据库问题。

  2. 优化代码之后重启pod正常一下,突然又不行了。我认为是k8s 集群网络问题,调查了好长时间pod 访问数据库位网络问题。排除pod和数据网络问题。

  3. 通过JVisualVm 查看Pod jvm堆栈信息。发现survivor区回收不了,手动GC之后,rt又正常了。看了一下jvm参数,根本就没有配置jvm参数,只设置堆栈的大小。

    survivor区回收不数据,然后手动执行了GC操作。发现rt恢复了。

  4. 添加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垃圾回收优化

本项目适当调整InitiatingHeapOccupancyPercentG1NewSizePercenG1MaxNewSizePercent值比例。

-XX:InitiatingHeapOccupancyPercent:一般会简写IHOP,默认是45%,这个占比跟并发周期的启动相关,当空间占比达到这个值时,会启动并发周期。如果经常出现FullGC,可以调低该值,尽早的回收可以减少FullGC的触发,但如果过低,则并发阶段会更加频繁,降低应用的吞吐。
-XX:G1NewSizePercent:年轻代最小的堆空间占比,默认是5%。
-XX:G1MaxNewSizePercent:年轻代最大的堆空间占比,默认是60%。

G1调优参考

G1调优参考