欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

记一次性能优化

程序员文章站 2022-03-02 17:09:01
...

背景

我司开发了一个非常牛的基础设施,产品的定位可以参考 Apache Hudi,也有一点 Apache Iceberg 的影子。我这边负责的实现主要是 Flink 的写入和 Spark 的读取,开发后就是最有意义的性能调优了~

优化

除去最基本的通过打印日志排查到底是哪个步骤执行时间较长不谈,着重讲一讲如何通过内存和CPU情况来定位性能问题。

内存优化

在数据写入阶段,观察 Flink 的 TM 进程,发现其有频繁的 FGC,使用 MAT 工具 dump 后发现并不存在大对象问题。操作步骤如下:

// 查看 GC 命令
/usr/jdk64/jdk1.8.0_152/bin/jstat -gcutil PID  3s

// 使用 MAT 工具步骤
// 1、查看当前 Linux 版本
# 运行uname -m 看一下linux是 x86_64还是 x86的帮助你选择下载那个版本。
uname -m
#x86_64

// 2、下载
[EclipseMAT](http://www.eclipse.org/mat/downloads.php)
wget http://eclipse.stu.edu.tw/mat/1.9.0/rcp/MemoryAnalyzer-1.9.0.20190605-linux.gtk.x86_64.zip

// 3、解压配置MAT基本参数
unzip MemoryAnalyzer-1.8.0.20180604-linux.gtk.x86_64.zip
## 修改MAT的内存大小, 注意这个大小要根据你dump文件大小来的,如果dump文件是5GB那么 这里最好配>5GB 否则会报MAT内存不足的异常
## 修改MemoryAnalyzer.ini 的 -Xmx6024m 
vi MemoryAnalyzer.ini

//4、jmap dump整个堆
jmap -dump:format=b,file=jmap.info PID

// 5、MAT分析 dump
 ./ParseHeapDump.sh jmap.info  org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components

/ /6、等待.... 结果会生产如下三个zip文件,很小可以直接拷贝到本机
jmap_Leak_Suspects.zip
jmap_System_Overview.zip
jmap_Top_Components.zip
直接把zip下载到本地,然后解压用浏览器查看index.html

一顿排查后只能确认确实是内存分配不合理,而不存在内存泄露问题,于是调整了 Flink Manager Memory 降低 State 内存以此增加 JVM Heap 内存。

CPU 优化

简易版,top + jstack

根据 top 找到 CPU 超过百分百(taskmanager.numberOfTaskSlots: 1) 的目标进程PID,对其不断进行 /usr/jdk64/jdk1.8.0_152/bin/jstack -F PID | less 命令操作,搜索观察是否有自己的业务代码不断处于 IN_JAVA 或者 RUNNING 状态,若存在,即可初步判断业务代码一直占据线程资源。比如我有一段代码不断在 catch 异常,虽然异常没有导致程序的崩溃,但是不断的 catch 还是会耗费大量的CPU~

进阶版 ,arthas

Arthas 热力图

1、先下载 arthas (arthas)
2、在解压目录运行 java -jar arthas-boot.jar (需要在程序cpu100%的机器上运行)
如用户不一致,则 sudo -u yarn java -jar /opt/arthas-boot.jar
3、选择进程号
4、输入 profiler start
5、几秒钟后输入 profiler stop,将 xx.svg 文件用浏览器打开

相关标签: flink