Apache Ignite 中可能存在内存泄漏?

Possible Memory leak in Apache Ignite?

我正在尝试将 Ignite 用作内存数据库,用于值范围从 50MB 到 800MB 的键值对。看起来 Ignite 通过 JVM 分配堆 space 它永远不会清理,即使缓存条目不在堆中,被清除,没有连接的客户端也没有 运行ning 操作。我的机器无法处理这种内存消耗,因此我正在寻找一种清理内存的方法。

我的测试场景如下:

我正在使用 pyignite 瘦客户端通过 python 脚本在本地测试 Ignite:

client = Client()
client.connect('localhost', 10800)

my_cache = client.get_or_create_cache('default')
my_cache.clear()

data = createData() #creates 800 000 000 bytes test data

def put(caches):
  i = caches
  while i > 0:
    my_cache.put('my key' + str(i), data)
    i -= 1

put(5)

my_cache.remove_all()
my_cache.destroy()
client.close()

脚本将 800 MB 数据顺序写入 5 个不同的缓存条目中。以下快照说明了 Ignite 的堆如何增长到峰值,这本身是可以理解的,但即使在执行 GC 之后仍保持在 10GB 左右:

Ignite heap

使用相同的数据执行第二次测试运行 并不会导致 GC 后更大的堆消耗,这让我相信 Ignite 会在内部为传入数据分配缓冲区,这与数据。这个内存消耗实在是太大了,我的机器在很长的运行.

中都无法处理。

ignite 配置非常简单:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
        
        <!-- Durable memory configuration. -->
        <property name="dataStorageConfiguration">
            <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
            <property name="dataRegionConfigurations">
                <list>
                <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
                    <!-- Custom region name. -->
                    <property name="name" value="10GB_Region"/>
                    <!-- 100 MB initial size. -->
                    <property name="initialSize" value="#{100L * 1024 * 1024}"/>
                    <!-- 10GB maximum size. -->
                    <property name="maxSize" value="#{10096L * 1024 * 1024}"/>
                </bean>
                
                </list>
            </property>
                <!-- Redefining the default region's settings -->
                <property name="defaultDataRegionConfiguration">
                    <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
                        <property name="name" value="Default_Region"/>
                        <property name="maxSize" value="#{5L * 1024 * 1024 * 1024}"/>
                    </bean>
                </property>
            </bean>
        </property>



        <property name="cacheConfiguration">
            <list>
                <!-- Partitioned cache example configuration (Atomic mode). -->
                <bean class="org.apache.ignite.configuration.CacheConfiguration">
                    <property name="name" value="default"/>
                    <property name="atomicityMode" value="ATOMIC"/>
                    <property name="backups" value="1"/>
                    <property name="dataRegionName" value="10GB_Region"/>
                </bean>
            </list>
        </property>

        <property name="discoverySpi">
            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
                <property name="ipFinder">
                    <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder">
                        <property name="addresses">
                            <list>
                                <value>127.0.0.1:47500..47509</value>
                            </list>
                        </property>
                    </bean>

                </property>
            </bean>
        </property>
    </bean>
</beans>

非常感谢任何帮助!

  1. Apache Ignite 默认不在堆上保存数据,相反,它将保存数据 off-heap。
  2. Apahce Ignite 在删除数据时确实不会释放 off-heap,但在摄取新数据时它会允许 re-use 表示 off-heap。
  3. 完全不清楚为什么您的工具会报告使用了 ~16G 堆,因为 Ignite 在提供的配置下不应使用超过几百 MB。如果那不仅是堆而且是所有 RAM,那么您就可以了。您应该期望分配 10G。为什么它在 Size 字段中报告更多不清楚。

很抱歉让任何感兴趣的人耽搁了这么久,但在联系 Ignite 邮件列表后,我确实得到了问题的答案。显然,Ignite 从来没有打算在单个查询中消耗如此大量的数据。所描述的行为是预期的,并且与将数据分成包并将其发送到其他节点或将其放入持久性有关。建议的解决方案是将数据分块成更小的位。由于目前在我的情况下这是不可能的,所以我放弃了 Ignite 并寻找其他方法来存储我的数据。