一.问题现象
flink运行一会就报心跳超时 数据量不是很大
版本 1.10
taskmanager.err日志
web界面日志报心跳超时
二.问题定位
1. 得到taskmanager的pid
进入到tm的web界面查看运行在哪台机器上,并且得到端口号为40002
在slave4上输入以下命令即可得到进程id为24047
netstat -anp | grep 40002
2.进入到slave4节点上使用jstat -gc 进程id 1000 查看gc情况
从下图看出
S0C:s0区的大小
S1C: s1区的大小
S0U: S0区使用大小
Ec : 伊甸园区的大小
OC :老年代大小
OU:老年代使用了多少
MC:元空间大小
MU:元空间使用了多大
YGC:年轻代 gc次数
YGCT: 年轻代gc 时间
FGC :FULL gc 次数
FGCT: full gc 时间
从下图可以看出 Fgc 3700多次~ 到4000多次和 Ygc差不多次数。
并且 老年代还有很多资源,新生代也有很多资源。没理由会执行Fullgc。
注意:该任务id和第1步查看到的任务id不是同一个第一步只是说一下怎么得到pid。
3.使用jstat -gccause 9678 1000
metadata gc threshold, Last dicth collection
元数据GC阈值,从这里看出是元空间太小导致,并且从上上图看到元空间大小几乎快满了。
元空间介绍 https://www.cnblogs.com/williamjie/p/9558136.html
从tm的log查看发现元空间 是90多M。flink1.10默认元空间大小是256M(该问题暂时不清楚是由什么原因导致,待查清楚原因)
三.问题解决
1. 编辑flinkconf.yaml增加env.java.opts: -XX:MaxMetaspaceSize=256M配置,这样可以覆盖原来的90多M的配置,然后重新提交任务
2. 再次监控gc是否正常
Fgc4次,Ygc 1次。
3. 任务运行三小时再次监控
full gc 次数还是四次
4.还原配置换一个groupid消费同样的topic然后提交任务
经过测试 还原配置之后 又会存在 一直full gc 问题,然后 tm心跳超时。