背景:升级某银行风控系统内存数据库,8亿数据。升级后存在性能下降的风险,切换一台后端服务对接新的内存数据库,对比发现超时率上升(要求TP99 18ms),性能果然下降(此时怀疑新版本内存数据库性能更差)
问题分析过程:
1. 抽取超时数据对比,发现数据量比较小的交易经常超时,数据量比较大的交易新的服务性能反而更好,排除内存数据库问题
2. 进一步统计这些数据量比较小的数据超时时间点,发现超时时间点和JVM GC时间点完全一致
3. 对比新的服务JVM GC日志和老的JVM GC日志,发现
1)新的服务GC时间更长(40ms左右),老的服务GC时间只需要10ms左右
2)新的服务GC频率更频繁
4. GC频率频繁可能是新的服务SDK新起的线程变多了,调大Xmn,性能变好了一些,但是比老的服务性能还是更差
5. GC日志中
[Times: user=0.11 sys=0.76, real=0.04 secs]
sys耗时比较长,说明CPU被系统调度占用较多,这个应该是新的服务所在机器外部服务较多导致,调小-XX:ParallelGCThreads,让CPU对GC回收的影响较少,性能进一步提升
最终新的服务性能和老的服务相当,甚至稍微更好一些(升级后的内存数据库性能更好),至此jvm性能调优结束