前言
上一篇讲了JVM性能调优的实战工具JVM性能调优监控工具实战(jconsole,jvisualvm),针对于普通jar包的进程只需配置JXM即可,这篇讲解真实业务场景中服务器负载过高,首先找出性能耗费最高的进程,然后通过jconsole.exe和jvisualvm.exe工具分析。不出意外,这将是全网第一篇讲远程监控flink任务的教程
工具介绍:
- jconsole:是一个内置 Java 性能分析器,分析堆栈溢出、多线程死锁等效果俱佳
- jvisualvm:监控内存泄露,跟踪垃圾回收,执行时内存、cpu分析,线程分析
概念解释:
Java RMI:Java远程方法调用,即Java RMI(Java Remote Method Invocation)
Java JMX: Java管理扩展,即Java JMX(Java Management Extensions)
使用JMX技术监控远程Java进程,具体参数解析:
-Djava.rmi.server.hostname=10.92.2.xx //配置远程主机地址,即jar包运行所在系统的IP地址
-Dcom.sun.management.jmxremote.port=31001//指定JMX的运行端口,jconsole需要对接的既是该端口
-Dcom.sun.management.jmxrete.ssl=false // 是否允许使用ssl方式接入
-Dcom.sun.management.jmxremote.authenticate=false //是否需要进行身份验证
此处hostname千万不能写localhost
以上配置,普通java进程,放在启动脚本中,而flink任务需要如下操作:
配置Java OPTS
找到flink安装路径,bin目录下,编辑config.sh文件(flink在执行flink-cluster.sh时会调用这个config.sh文件,这个文件是flink的环境变量等配置)。
- DEFAULT_ENV_JAVA_OPTS="" # Optional JVM args
- DEFAULT_ENV_JAVA_OPTS_JM="" # Optional JVM args (JobManager)
- DEFAULT_ENV_JAVA_OPTS_TM="" # Optional JVM args (TaskManager)
此处配置的是flink的taskManager或者jobManger,如果配置了自身JVM,那么会出现JMX端口冲突,导致taskManager无法正常启动。
启动Flink
./start-cluster.sh
可以看到taskManger和jobManger都正常启动
Jconsole远程连接:
两种方式启动:
1、通过dos命令行:
Jconsole root@10.92.2.xx:port
2、直接运行:
java安装目录下:D:\Program Files\Java\jdk1.8.0_201\bin,双击jconsole.bat
JVM性能分析图:
测试一下:
启动一个脚本,每秒发送500条数据到kafka,观察CPU、内存性能变化:
大概在17:27开始发数据:效果如图
顺便介绍一下jconsole的升级版——jvisualvm.exe,一般搭配jconsole同时使用,jvisualvm.exe可以当大屏看,jconsole.exe看具体信息,下图开始飙升的时间点就是开始跑数据的时间,能看到具体某个进程的性能消耗:
服务端执行top查看飙升的进程:
进入top执行,按e切换单位,按c显示具体的进程信息,可以看到cpu飙升到3个核,内存占用也飙升,而此进程正是flink任务,接下来就是进行具体的分性能调优了。
jconsole.exe和jvisualvm.exe更能用于本地开发阶段的代码质量追踪和调试,远程监控的方法会了,本地监控也会了。