问题原因:
提交flink任务,代码修改之后,任务重启之后,数据延迟严重,处理不完
问题分析:
任务是正常的,但是发生了被压,没有任务ERROR。
1.首先查看CPU和内存:
机器内存只使用了三分之二,但是CPU从60%达到90%
image.png
2.分析CPU消耗在哪里了:
用的arthas,打的火焰图
image.png
可以发现,左边是flink任务代码,但是右边GC代码占用大量CPU,
查看GC日志,发现Full GC 频率很大,基本上一两分钟一次。
3.GC 频繁,说明要么内存不够要么就是发生了内存泄漏。但是我将内存改大之后并没有解决问题,仍然是偶然重启之后会发生CPU徒增。说明可能是内存泄漏。
4.用MAT工具分析了当前内存状态。
Leak Suspects分析
其中这几个都是一个问题,都是我使用的GuavaCache,占用了大量内存。
例如
说明GuavaCache在任务停止的时候并没有被垃圾回收。
解决办法:
在任务停止时,在每个function的close方法里,调用cache的clear方法,并将指针指向null。重启之后观察了一下,在多次重启之后,CPU正常,未出现上述问题,垃圾回收正常。
参考: 1 .如何避免内存泄漏:https://blog.csdn.net/xidiancyp/article/details/51418158
2.CPU过高如何判断:https://www.cnblogs.com/breeze-24/p/9098978.html
- 如何处理内存满了:
1、待运行稳定后GC之后用jmap抓取内存快照
2、重新运行可能产生内存泄露的代码
3、GC到稳定之后再次抓取内存快照
4、对比2次快照就可知道了
网友评论