Ignite DataStreamer 中可能存在的内存泄漏断续器解释该怎么办
我在启用了持久性的 Kubernetes 集群中运行 Ignite。每台计算机都有一个 24GB 的 Java 堆,其中 20GB 专用于持久内存,内存限制为 110GB。我的相关 JVM 选项是 .在每个节点上运行 DataStreamers 几个小时后,我的集群上的节点达到了 k8s 内存限制,触发了 OOM 终止。运行Java NMT后,我惊讶地发现分配给内部存储器的大量空间。-XX:+AlwaysPreTouch -XX:+UseG1GC -XX:+ScavengeBeforeFullGC
Java Heap (reserved=25165824KB, committed=25165824KB)
(mmap: reserved=25165824KB, committed=25165824KB)
Internal (reserved=42425986KB, committed=42425986KB)
(malloc=42425954KB #614365)
(mmap: reserved=32KB, committed=32KB)
Kubernetes指标证实了这一点:
“Ignite Cache”是内核页面缓存。最后一个面板“堆 + 持久 + 缓冲区”是点火指标 + + 的总和。HeapMemoryUsed
PhysicalMemorySize
CheckpointBufferSize
我知道这不可能是数据堆积的结果,因为DataStreamers在读取每个文件后都会被刷新(最多约250MB),并且没有节点一次读取超过4个文件。在排除了其他问题之后,我尝试设置 ,并调用手动 GC,但除了定期关闭所有 Pod 并重新启动它们之外,似乎没有任何影响。-XX:MaxDirectMemorySize=10G
我不知道该何去何从。Ignite 中是否有不强制我使用第三方数据库的解决方法?
编辑:我的数据存储配置
<property name="dataStorageConfiguration">
<bean class="org.apache.ignite.configuration.DataStorageConfiguration">
<property name="metricsEnabled" value="true"/>
<property name="checkpointFrequency" value="300000"/>
<property name="storagePath" value="/var/lib/ignite/data/db"/>
<property name="walFlushFrequency" value="10000"/>
<property name="walMode" value="LOG_ONLY"/>
<property name="walPath" value="/var/lib/ignite/data/wal"/>
<property name="walArchivePath" value="/var/lib/ignite/data/wal/archive"/>
<property name="walSegmentSize" value="2147483647"/>
<property name="maxWalArchiveSize" value="4294967294"/>
<property name="walCompactionEnabled" value="false"/>
<property name="writeThrottlingEnabled" value="False"/>
<property name="pageSize" value="4096"/>
<property name="defaultDataRegionConfiguration">
<bean class="org.apache.ignite.configuration.DataRegionConfiguration">
<property name="persistenceEnabled" value="true"/>
<property name="checkpointPageBufferSize" value="2147483648"/>
<property name="name" value="Default_Region"/>
<property name="maxSize" value="21474836480"/>
<property name="metricsEnabled" value="true"/>
</bean>
</property>
</bean>
</property>
更新:当我禁用持久性时,内部存储器被正确处置:
更新:此处通过可重现的示例演示了此问题。它可以在至少具有22GB的docker内存和大约50GB存储空间的计算机上运行。有趣的是,只有在传入字节数组或字符串作为值时,泄漏才真正明显。