现象
team新发版一个Flink作业,在老作业上有修改,做发版前最后的验证发现,Fliink作业有反压的现象,有算子报红,查看topic 消费者组有lag
分析
当时的现象类似下图,最后一个点显示busy max 100%
猜想1
数据倾斜
并行度是3,看了下每个task 处理数据量比较均匀
猜想2
调用外部接口耗时长
使用arthas trace 接口发现耗时都是20ms 左右
猜想3
taskmanager 节点频繁GC ,导致停顿
查看task 节点GC 次数和耗时正常
猜想4,确认代码变化
确认代码变动很少? 应该不是代码问题
思考
几板斧下来,感觉还是没看到问题在哪
大招(火焰图)
调整配置,把火焰图打开
rest.flamegraph.enabled : true
On-cpu
查看On-cpu 火焰图类似如下
off-cpu 图
分析
程序中没有锁相关的,所以先不考虑off-cpu
从on-cpu来看,很显示作业大部分的cpu 都在执行socket 代码
这里当时没注意,后来发现其实不应该有很多时间执行这个代码,至于为啥会调socket ,从上往下看是因为程序里去调一个外部的http接口导致的。
正常逻辑这个接口的频率不应该很高,说明代码变动有问题,再次确认代码变动确认有问题,修复代码后重新上线后,任务正常,也没有lag,总是解决。
火焰图
火焰图示例代码
public class HotTest {
public static void main(String[] args) {
run();
}
private static void run() {
runA();
runB();
}
private static void runB() {
for (int i = 0; i < 300000; i++) {
System.out.println("this is b");
}
}
public static void runA() {
runC();
for (int i = 0; i < 500000; i++) {
System.out.println("this is a");
}
}
private static void runC() {
for (int i = 0; i < 200000; i++) {
System.out.println("this is c");
}
}
}
idea 上执行
生成火焰图
如何看
y轴代码函数调用的深度
x轴宽度代表函数采样次数,可以简单为耗时
从火焰图来看
run 函数耗时=runA()+runB()
runA 函数耗时=runC()+打印
所以这个图虽然看起来很复杂,分析问题时,只需要看所有最顶层的函数的宽度即可,再根据最宽的函数从上往下找下,是哪个业务在执行这个,分析即可
回到最开始的问题
大部分的cpu 都在执行socket 代码,socket 代码是因为频繁调接口导致,最后发现这里有问题导致。
总结
火焰图在分析性能场景中,确认非常方便,以后要加强这方面学习。