火焰图分析Flink反压

本文通过一个Flink作业出现反压和lag的现象,逐步分析了可能的原因,包括数据倾斜、外部接口耗时、GC问题等。最终通过开启火焰图,发现是由于频繁调用外部HTTP接口导致CPU占用过高。修复代码后,问题得到解决,强调了火焰图在性能分析中的重要作用。
摘要由CSDN通过智能技术生成

现象

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 代码是因为频繁调接口导致,最后发现这里有问题导致。

总结

火焰图在分析性能场景中,确认非常方便,以后要加强这方面学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wending-Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值