我正在运行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(堆/非堆)部分中显示的值,即11gb Network Memory Segments
:我假设,由于1gb现在用作网络缓冲内存,所以32768段基本上是指32kib大小的内存段的计数。它们用于任务间数据传输的tcp通道。我的理解是,它仍然在堆上(因此从声明的堆中减去),但已分配 more like ByteBuffer.allocate()
. 对吗?
在这个博客之后,特别是在处理比特和字节的时候, 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
公制。有没有一个指标暴露了这一点。
也,
直接内存和Map内存度量是指什么。我使用rocksdb作为我的状态后端。那么,是不是状态的大小,是堆外管理的?它的容量和用途是如何由Flink决定的。如果可能的话,这种价值观的错误配置会导致什么样的问题浮出水面。
此外,这是一个流式工作,如果不知何故,这是重要的。
1条答案
按热度按时间83qze16e1#
网络缓冲区脱离堆。这是我可以自信地回答的一点。
否则,请参阅本博客文章末尾关于内存的部分:https://flink.apache.org/news/2019/02/25/monitoring-best-practices.html. 希望这会有所帮助。