Pyflink JVM Metaspace 内存泄漏定位

classic Classic list List threaded Threaded
10 messages Options
Reply | Threaded
Open this post in threaded view
|

Pyflink JVM Metaspace 内存泄漏定位

YueKun
This post was updated on .
Hi,
有个 JVM Metaspace OOM 的问题想请求下帮助,我通过pyflink 提交一些 Batch 任务,任务内执行的是查询 Mysql 的数据统计完写入 Kafka,之后任务就 finished 了。但是发现每次执行任务,JVM Metaspace 的内存会不断增长,即使任务结束后,内存仍然不会释放减少。 这个可能是Flink的哪里设置不对导致的吗?还是代码原因呢?
JVM Metaspace Max大小是默认的 256 MB,每次跑这个 Batch 的统计任务后用量就会增加十几M,这样最后就OOM了。
Flink 通过 Docker 运行的 1.12 版本,配置基本都是默认的,JVM这些没有额外设置什么。
任务的内容比较简单,查询一张Mysql的表,然后统计几个数据,SQL里用了 COUNT() FILTER () 这种语句,结果写入 Kafka。
代码中 使用 pipeline.jars 添加了所需要的 Mysql 和 Kafka 连接所需的 jar 包。
使用Blink的Batch mode,env_setting = EnvironmentSettings.new_instance().in_batch_mode().use_blink_planner().build()
整体和官方例子差不多,所以不太清楚是哪里有问题。希望能帮助分析下原因。
Reply | Threaded
Open this post in threaded view
|

Re: Pyflink JVM Metaspace 内存泄漏定位

Xintong Song
你用的是 Flink 是哪个版本?Flink 有一些已知的、已修复的 metaspace 泄露问题 [1] [2],看下是否符合你的情况。

另外,也不排除与你的代码实现、用到的依赖包的实现相关。具体问题定位需要 jstack / jmap 检查一下是否有此前任务的残留 thread /
object。

Thank you~

Xintong Song


[1] https://issues.apache.org/jira/browse/FLINK-16408
[2] https://issues.apache.org/jira/browse/FLINK-20333

On Tue, Jan 19, 2021 at 4:07 PM 岳坤 <[hidden email]> wrote:

> Hi, 有个 JVM Metaspace OOM 的问题想请求下帮助,我通过pyflink 提交一些 Batch 任务,任务内执行的是查询
> Mysql 的数据统计完写入 Kafka,之后任务就 finished 了。但是发现每次执行任务,JVM Metaspace
> 的内存会不断增长,即使任务结束后,内存仍然不会释放减少。 这个可能是Flink的哪里设置不对导致的吗?还是代码原因呢? JVM Met
Reply | Threaded
Open this post in threaded view
|

Re: Pyflink JVM Metaspace 内存泄漏定位

YueKun
非常感谢回复!

Flink 版本是使用的 1.12.0,通过
https://github.com/apache/flink-docker/tree/master/1.12/scala_2.12-java11-debian
编译的Docker 镜像,然后外层又安装的python3环境生成最终的镜像。(不知道为什么我发的邮件到平台上后会少一部分,我又单独在平台编辑了一下)。

之前邮件的剩余内容是:
JVM Metaspace Max大小是默认的 256 MB,每次跑这个 Batch 的统计任务后用量就会增加十几M,这样最后就OOM了。
Flink 通过 Docker 运行的 1.12 版本,配置基本都是默认的,JVM这些没有额外设置什么。
任务的内容比较简单,查询一张Mysql的表,然后统计几个数据,SQL里用了 COUNT() FILTER () 这种语句,结果写入 Kafka。
代码中 使用 pipeline.jars 添加了所需要的 Mysql 和 Kafka 连接所需的 jar 包。
使用Blink的Batch mode,env_setting =
EnvironmentSettings.new_instance().in_batch_mode().use_blink_planner().build()
整体和官方例子差不多,所以不太清楚是哪里有问题。希望能帮助分析下原因。

好的,我尝试 jstack / jmap看看是否能定位到原因。



--
Sent from: http://apache-flink.147419.n8.nabble.com/
Reply | Threaded
Open this post in threaded view
|

Re: Pyflink JVM Metaspace 内存泄漏定位

YueKun
In reply to this post by Xintong Song
目前看泄漏是因为 mysql 的 JDBC 引起的,和
http://apache-flink.147419.n8.nabble.com/1-11-1-OutOfMemoryError-Metaspace-td8367.html#a8399
这个问题一样。这个有什么解决方法吗?需要更换 mysql-connector-java 版本吗? 我目前用的 5.1.49 版本



--
Sent from: http://apache-flink.147419.n8.nabble.com/
Reply | Threaded
Open this post in threaded view
|

Re: Pyflink JVM Metaspace 内存泄漏定位

Xintong Song
JDBC连接是谁创建的,能找到相关调用栈吗,是 flink 提供的 connector 还是用户代码?

Thank you~

Xintong Song



On Wed, Jan 20, 2021 at 6:32 PM YueKun <[hidden email]> wrote:

> 目前看泄漏是因为 mysql 的 JDBC 引起的,和
>
> http://apache-flink.147419.n8.nabble.com/1-11-1-OutOfMemoryError-Metaspace-td8367.html#a8399
> 这个问题一样。这个有什么解决方法吗?需要更换 mysql-connector-java 版本吗? 我目前用的 5.1.49 版本
>
>
>
> --
> Sent from: http://apache-flink.147419.n8.nabble.com/
>
Reply | Threaded
Open this post in threaded view
|

Re: Pyflink JVM Metaspace 内存泄漏定位

YueKun
我是Python的table
API实现的,connector是jdbc,jar包是用的flink网站上提供的链接里的(https://ci.apache.org/projects/flink/flink-docs-release-1.12/dev/table/connectors/jdbc.html),有
flink-connector-jdbc_2.11-1.12.0.jar 和 mysql-connector-java-5.1.49.jar。

任务是用SQL写的,基本和flink提供的demo的代码一致:
"
) WITH (
   'connector' = 'jdbc',
   'url' = 'jdbc:mysql://localhost:3306/mydatabase',
   'table-name' = 'users'
);
"

Jmap导出的数据分析看如下:
<http://apache-flink.147419.n8.nabble.com/file/t1276/WX20210120-191436.png>




--
Sent from: http://apache-flink.147419.n8.nabble.com/
Reply | Threaded
Open this post in threaded view
|

Re: Pyflink JVM Metaspace 内存泄漏定位

YueKun
In reply to this post by Xintong Song
hi,不确定是否能看到图片,Jmap导出的数据分析看如下:<http://apache-flink.147419.n8.nabble.com/file/t1276/WX20210120-191436.png>



--
Sent from: http://apache-flink.147419.n8.nabble.com/
Reply | Threaded
Open this post in threaded view
|

Re: Pyflink JVM Metaspace 内存泄漏定位

Xintong Song
cc @Jark
看起来像是 JDBC connector 的问题。这块你熟悉吗?或者知道谁比较熟悉吗?

Thank you~

Xintong Song



On Wed, Jan 20, 2021 at 8:07 PM YueKun <[hidden email]> wrote:

> hi,不确定是否能看到图片,Jmap导出的数据分析看如下:<
> http://apache-flink.147419.n8.nabble.com/file/t1276/WX20210120-191436.png>
>
>
>
>
> --
> Sent from: http://apache-flink.147419.n8.nabble.com/
>
Reply | Threaded
Open this post in threaded view
|

Re: Pyflink JVM Metaspace 内存泄漏定位

YueKun
非常抱歉,之前的信息有误,我是用 MAT 工具解析后,exclude all phantom/weak/soft etc. references
后,最后的信息是:

org.apache.flink.util.ChildFirstClassLoader @ 0xb0c14308
class com.mysql.cj.jdbc.Driver @ 0xb0f95a20
com.mysql.cj.jdbc.Driver @ 0xb10183c8
java.sql.DriverInfo @ 0xb10183b0
java.lang.Object[12] @ 0xb1499308
java.util.concurrent.CopyOnWriteArrayList @ 0xae6ea508
class java.sql.DriverManager @ 0xae6e6358

看着还是 JDBC 的问题。

之前 JDBC 的 AbandonedConnectionCleanupThread
问题是通过使用mysql-connector-java-8.0.23.jar版本的包和设置
com.mysql.cj.disableAbandonedConnectionCleanup to true
解决了,但是目前看好像还有其他问题,因为我对Java不是非常了解,所以可能定位问题的方式不是太正确,还希望能帮忙看一下这个情况。





--
Sent from: http://apache-flink.147419.n8.nabble.com/
Reply | Threaded
Open this post in threaded view
|

Re: Pyflink JVM Metaspace 内存泄漏定位

YueKun
关闭问题,已经解决,解决方法是不通过 pipeline.jars 的方式跟随python任务动态提交jar包,改为放在 FLINK_HOME/lib 下



--
Sent from: http://apache-flink.147419.n8.nabble.com/