我正在运行Flink 1.8版。
主要配置如下:
env.java.opts: -Djavax.net.ssl.keyStoreType=JKS -Djavax.net.ssl.trustStoreType=JKS
taskmanager.heap.size: 12288m
taskmanager.numberOfTaskSlots: 7
声明的堆大小为12GB,为什么它在概述部分中显示7.33GB。
根据文档,Heap Size = declared heap size - network buffer memory(Default: 0.1 times declared heap but up to max 1gb)
。因此,正确的值是JVM(Heap / Non-Heap)部分中显示的值,即。 11GB
Network Memory Segments
:我假设,因为现在1GB用作网络缓冲存储器,所以32768段基本上是指32KiB大小的内存段的数量。这些用于TCP通道,以在任务之间传输数据。我的理解是它仍在堆上(因此从声明的堆中减去)但已分配more like ByteBuffer.allocate()
。正确吗?
[跟随此博客Juggling with bits and bytes,特别是By default 70% of the JVM heap that is available after service initialisation is allocated by the MemoryManager.
。因此,这是任务以内存段的形式使用的内存,用于在它们处缓冲数据以进行检查点对齐,广播的数据,窗口数据等。由于在这种情况下为taskmanager.memory.off-heap = false
,因此将在堆上分配此内存。因此,我假设这里显示的4.95GB的已用内存基本上是任务用来从托管内存中为各种目的缓冲数据的内存,应为11GB * 0.7 = 7.7GB
。
我如何获得此managed memory
指标。是否有为此公开的指标。
也,
直接内存和映射内存指标指的是什么。我正在使用RocksDB作为状态后端。那么,状态大小是由堆管理的吗? Flink如何确定其容量和用途。可能由于此值的配置错误而出现什么样的问题。
此外,这在某种程度上很重要,这是一项流媒体工作。
网络缓冲区是堆外的。我可以自信地回应这一点。
否则,请参阅此博客文章结尾处有关内存的部分:https://flink.apache.org/news/2019/02/25/monitoring-best-practices.html。希望这会有所帮助。