记录一次生产环境bug的调试
-
先交代下问题以及背景:
公司数据处理中的一个job一直跑的好好的,突然从某一天开始job执行失败,重启环境后又正常执行,简单查看问题日志,日志中出现大量connection reset信息,问题不间断出现,并且dev环境无法重现。 -
初始思路
一开始运维把问题当作一个简单的网络连接中断问题来对待,修复思路大概开发是对运算框架中如果出现了类似的connection中断问题添加对应的重连机制进行应对。 -
实际问题
随着时间推移,问题越来越频繁,甚至重启后job都会继续失败。于是需要对线上的实际情况进行进一步摸排。首先查看了业务代码,发现一些做join的表没有做合适的缓存,另外一些数据量非常大的raw data中的filter数据貌似也没有生效,导致上亿的数据直接被计算框架拉入了jvm中,而之前的运算又迟迟没有结束,大量的线程处于运算中。有了这个发现于是在任务失败后让运维拉取了jstat -gcutil状况,发现果不其然,一次任务执行触发了多次的fullgc ,因为生产环境使用的是G1,如此多的的full gc充分说明了问题
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 100.00 65.99 41.09 91.41 - 3327 668.558 24 1436.491 2105.048
如上所示一次f