记一次性能优化
背景
我司开发了一个非常牛的基础设施,产品的定位可以参考 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 文件用浏览器打开
上一篇: 记一次性能优化的艰苦历程