Flink 使用 RocksDB CPU 打满

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

Flink 使用 RocksDB CPU 打满

fanrui
Hi,社区:
Flink 使用 RocksDB CPU 打满,90+% CPU 耗在了 RocksDB,80+% CPU 耗在了 RocksDB 的 snappy
数据解压。本地 RocksDB 的 sst 文件仅 60M。不明白为什么会这样?
火焰图链接:https://drive.google.com/file/d/183aiENLn5t22zSXX14mBLRZTZrjRO6Ar/view?usp=sharing

Thanks
fanrui



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

Re: Flink 使用 RocksDB CPU 打满

fanrui
备注一下:
Flink 任务并行度 1024,运行几分钟,就会有四五个 subtask 出现上述现象,其余 subtask 正常。
正常的 subtask 打出的火焰图是正常的:代码中每一步都占用了一部分 CPU,而不是 MapState 的 contains 操作占用了了大量
CPU。



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

Re: Flink 使用 RocksDB CPU 打满

Congxian Qiu
Hi
    从火焰图看,RocksDB#get 操作占用的时间较多,contains  会调用 RocksDB 的 get 函数
    1. 你使用的是哪个版本的 Flink?
    2. 不同 subtask 之间的数据是否均匀呢?这里主要想知道调用 RocksDB 的 get 函数调用频次是否符合预期
    3. 如果我理解没错的话,有 snappy 的压缩,这个会有 IO 的操作(也就是从磁盘 load 数据),可能还需要看下为什么这个
subtask 的数据大量落盘
Best,
Congxian


fanrui <[hidden email]> 于2020年9月1日周二 下午9:14写道:

> 备注一下:
> Flink 任务并行度 1024,运行几分钟,就会有四五个 subtask 出现上述现象,其余 subtask 正常。
> 正常的 subtask 打出的火焰图是正常的:代码中每一步都占用了一部分 CPU,而不是 MapState 的 contains 操作占用了了大量
> CPU。
>
>
>
> --
> Sent from: http://apache-flink.147419.n8.nabble.com/
Reply | Threaded
Open this post in threaded view
|

回复: Flink 使用 RocksDB CPU 打满

fanrui
Hi,感谢 Congxian 大佬回复!


1、 Flink version 1.10&nbsp;
2、 subtask 之间数据非常均匀,get 函数调用频次较多,但是每个 subtask 应该是类似的。
其他正常的 subtask 火焰图看着并不会大量停留在这里,而是火焰图上有各个位置的代码。
3、 sst 文件小的时候也会出现该问题,60M 的 sst 并不大,每个 butask 的 blockcache 能分到 1g 左右。


补充:
4、正常和非正常的火焰图来看,是 NewIndexIterator 这一步出了问题,有问题的火焰图走到了 NewIndexIterator 代码,但正常的火焰图基本 NewIndexIterator 不耗时。
NewIndexIterator 这一步应该是读索引相关操作,是不是 index 在 Cache 中放不下了,被频繁淘汰呢?

正常火焰图与非正常火焰图差异图示:https://drive.google.com/file/d/1DG4eTbaaozG_4ZxPQc_svmoyEXCdKZqb/view?usp=sharing
5、 调大一些 block cache 相关参数,调节之前运行 5 分钟任务就出现上述问题,调节之后运行 30 分钟出问题。
调节后的参数如下所示:
state.backend.rocksdb.memory.managed: true
state.backend.rocksdb.memory.write-buffer-ratio: 0.4
state.backend.rocksdb.memory.high-prio-pool-ratio: 0.5
taskmanager.memory.jvm-overhead.fraction: 0.05
state.backend.incremental: true
state.backend.rocksdb.block.cache-size: 3 gb
taskmanager.memory.managed.fraction: 0.5



6、 目前 RocksDB LOG 等级调到了 DEBUG,附上 LOG 文件:https://drive.google.com/file/d/1JpHMjwTyW0ej-GtPbg6NLigohG7o3U4Y/view?usp=sharing


Thanks
fanrui


------------------&nbsp;原始邮件&nbsp;------------------
发件人:                                                                                                                        "user-zh"                                                                                    <[hidden email]&gt;;
发送时间:&nbsp;2020年9月2日(星期三) 中午1:38
收件人:&nbsp;"user-zh"<[hidden email]&gt;;

主题:&nbsp;Re: Flink 使用 RocksDB CPU 打满



Hi
&nbsp;&nbsp;&nbsp; 从火焰图看,RocksDB#get 操作占用的时间较多,contains&nbsp; 会调用 RocksDB 的 get 函数
&nbsp;&nbsp;&nbsp; 1. 你使用的是哪个版本的 Flink?
&nbsp;&nbsp;&nbsp; 2. 不同 subtask 之间的数据是否均匀呢?这里主要想知道调用 RocksDB 的 get 函数调用频次是否符合预期
&nbsp;&nbsp;&nbsp; 3. 如果我理解没错的话,有 snappy 的压缩,这个会有 IO 的操作(也就是从磁盘 load 数据),可能还需要看下为什么这个
subtask 的数据大量落盘
Best,
Congxian


fanrui <[hidden email]&gt; 于2020年9月1日周二 下午9:14写道:

&gt; 备注一下:
&gt; Flink 任务并行度 1024,运行几分钟,就会有四五个 subtask 出现上述现象,其余 subtask 正常。
&gt; 正常的 subtask 打出的火焰图是正常的:代码中每一步都占用了一部分 CPU,而不是 MapState 的 contains 操作占用了了大量
&gt; CPU。
&gt;
&gt;
&gt;
&gt; --
&gt; Sent from: http://apache-flink.147419.n8.nabble.com/
Reply | Threaded
Open this post in threaded view
|

回复: Flink 使用 RocksDB CPU 打满

fanrui
In reply to this post by Congxian Qiu
再补充一下正常 subtask 火焰图:https://drive.google.com/file/d/1uiH2vNi0kMGHuiHOW5Wq-m053ys4rFHu/view?usp=sharing
代码中多次对状态的访问,从火焰图来看: contains 操作仅占整个 CPU 的 5.92%,且代码中多次对状态的访问占的 CPU 都是均匀的。
有问题的 火焰图,一个 MapState 的 contains 操作就把 CPU 打到了 90%




------------------&nbsp;原始邮件&nbsp;------------------
发件人:                                                                                                                        "user-zh"                                                                                    <[hidden email]&gt;;
发送时间:&nbsp;2020年9月2日(星期三) 中午1:38
收件人:&nbsp;"user-zh"<[hidden email]&gt;;

主题:&nbsp;Re: Flink 使用 RocksDB CPU 打满



Hi
&nbsp;&nbsp;&nbsp; 从火焰图看,RocksDB#get 操作占用的时间较多,contains&nbsp; 会调用 RocksDB 的 get 函数
&nbsp;&nbsp;&nbsp; 1. 你使用的是哪个版本的 Flink?
&nbsp;&nbsp;&nbsp; 2. 不同 subtask 之间的数据是否均匀呢?这里主要想知道调用 RocksDB 的 get 函数调用频次是否符合预期
&nbsp;&nbsp;&nbsp; 3. 如果我理解没错的话,有 snappy 的压缩,这个会有 IO 的操作(也就是从磁盘 load 数据),可能还需要看下为什么这个
subtask 的数据大量落盘
Best,
Congxian


fanrui <[hidden email]&gt; 于2020年9月1日周二 下午9:14写道:

&gt; 备注一下:
&gt; Flink 任务并行度 1024,运行几分钟,就会有四五个 subtask 出现上述现象,其余 subtask 正常。
&gt; 正常的 subtask 打出的火焰图是正常的:代码中每一步都占用了一部分 CPU,而不是 MapState 的 contains 操作占用了了大量
&gt; CPU。
&gt;
&gt;
&gt;
&gt; --
&gt; Sent from: http://apache-flink.147419.n8.nabble.com/
Reply | Threaded
Open this post in threaded view
|

Re: Flink 使用 RocksDB CPU 打满

Congxian Qiu
Hi
   index 相关的,或许可以看下这个文档[1]
[1]
https://github.com/facebook/rocksdb/wiki/Block-Cache#caching-index-filter-and-compression-dictionary-blocks
Best,
Congxian


范瑞 <[hidden email]> 于2020年9月2日周三 下午2:05写道:

> 再补充一下正常 subtask 火焰图:
> https://drive.google.com/file/d/1uiH2vNi0kMGHuiHOW5Wq-m053ys4rFHu/view?usp=sharing
> 代码中多次对状态的访问,从火焰图来看: contains 操作仅占整个 CPU 的 5.92%,且代码中多次对状态的访问占的 CPU 都是均匀的。
> 有问题的 火焰图,一个 MapState 的 contains 操作就把 CPU 打到了 90%
>
>
>
>
> ------------------&nbsp;原始邮件&nbsp;------------------
> 发件人:
>                                                   "user-zh"
>                                                                     <
> [hidden email]&gt;;
> 发送时间:&nbsp;2020年9月2日(星期三) 中午1:38
> 收件人:&nbsp;"user-zh"<[hidden email]&gt;;
>
> 主题:&nbsp;Re: Flink 使用 RocksDB CPU 打满
>
>
>
> Hi
> &nbsp;&nbsp;&nbsp; 从火焰图看,RocksDB#get 操作占用的时间较多,contains&nbsp; 会调用 RocksDB
> 的 get 函数
> &nbsp;&nbsp;&nbsp; 1. 你使用的是哪个版本的 Flink?
> &nbsp;&nbsp;&nbsp; 2. 不同 subtask 之间的数据是否均匀呢?这里主要想知道调用 RocksDB 的 get
> 函数调用频次是否符合预期
> &nbsp;&nbsp;&nbsp; 3. 如果我理解没错的话,有 snappy 的压缩,这个会有 IO 的操作(也就是从磁盘 load
> 数据),可能还需要看下为什么这个
> subtask 的数据大量落盘
> Best,
> Congxian
>
>
> fanrui <[hidden email]&gt; 于2020年9月1日周二 下午9:14写道:
>
> &gt; 备注一下:
> &gt; Flink 任务并行度 1024,运行几分钟,就会有四五个 subtask 出现上述现象,其余 subtask 正常。
> &gt; 正常的 subtask 打出的火焰图是正常的:代码中每一步都占用了一部分 CPU,而不是 MapState 的 contains
> 操作占用了了大量
> &gt; CPU。
> &gt;
> &gt;
> &gt;
> &gt; --
> &gt; Sent from: http://apache-flink.147419.n8.nabble.com/