使用arthas 排查 kafka 事件堆积

716 阅读2分钟

问题回顾

测试通过包回放技术压测一晚上,发现kafka堆积。我登上服务器排查发现每秒吞吐率仅3k左右,问了一下测试,1u8核心16g预期吞吐率为5-6k,压测85兆不堆积。

/capaa/kafka/bin/kafka-consumer-groups.sh --command-config=/capaa/kafka/config/kraft/sasl.properties --bootstrap-server 127.0.0.1:9092 --describe --all-groups | grep access

使用工具

压测工具

通过tcpreplay回放tcp包的形式。

 tcpreplay -i mc2 -M 85 -l 20000000000000000 /data/sql/scene3_merge.pcap &

函数级性能排查工具

trace com.hzmc.epc.plugin.staccount.cache.APIAccessExCache isAlert  -n 5 --skipJDKMethod false 

内存排查工具

jmap
jmap -dump:live,format=b,file=tomcat.hprof  5675 
arthas 导出

可以通过arthas 导出在fullgc之前导出dump文件

vmoption HeapDumpBeforeFullGC   true

gc排查工具

通过jstat 分析各种gc的耗时和数量

jstat -gcutil 5675 1000

arthas 全局火焰图排查工具

当无法通过阅读代码,定位到某个函数存在性能问题时,可以考虑使用arthas导出火焰图,分析全局的性能瓶颈。

profiler start --event cpu   --include '*Filter'


profiler stop  --file /tmp/result.html

总结和展望

一开始我的想法是,用arthas工具命trace命令,排查下耗时较大的函数。这种方法有效但是仅对耗时特别大的问题生效。比如字符串的equal和contains方法。修改这些后还是有系统压测100分钟还是有50w事件的堆积。另外同事也是使用arthas也发现了直接打印debug日志的问题。而没有首先判断是否开启debug日志再打印。改动上述两点后,继续压测未发现堆积问题,这里我留下了一个隐患,我把身份插件也还原到上一个版本。

后续测试压测验证时还是发现堆积,但是堆积没有那么明显。由于重心放在自己开发的代码和另一位同事自定义报表的功能上。尝试了使用各种方法导出trace 某些怀疑耗时的方法,但是没有发现特别耗时的问题。 ;使用mat导出dump文件,通过分析占比最多的类也没有收获;查看gc日志,发现ygc很多,而full gc 会一阵子多起来然后又降下去。都不能奏效。

通过arthas 导出全局性能火焰图排查工具发现IdentityConfig的实例化方法性能占比4%;查看下图38行代码发现,虽然使用了putIfAbsent 但是IdentityConfig对象还是会被实例化。而IdentityConfig是一个相对较重的类,每次实例化都需要new 一个caffeine 缓存。后续替包压测后没有堆积问题。

image.png

9730da91bdfc491953814c671192bd5.png

cdfdb3a1d7fa1a8b0629a9f6a048072.png