我正在运行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如何确定其容量和用途。可能由于此值的配置错误而出现什么样的问题。
如果这很重要,这也是一项流媒体工作。
答案 0 :(得分:0)
网络缓冲区不可用。这是我可以自信地回应的一点。
否则,请参阅此博客文章结尾的“内存”部分:https://flink.apache.org/news/2019/02/25/monitoring-best-practices.html。希望这会有所帮助。