繁体   English   中英

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

[英]Possible Memory leak in Apache Ignite?

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

我的测试场景如下:

  • 点燃版本 2.9
  • 使用 OpenJDK 11 运行

我正在使用 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 左右:

点燃堆

使用相同的数据执行第二次测试运行不会导致 GC 后更大的堆消耗,这让我相信 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>
  • ignite visor 特别说明缓存是堆外的
  • VisualVM 直方图表示 98% 的活动字节映射到 byte[]
  • 似乎有客户端连接器和数据流传输器条带线程保持打开状态,缓存中的每个放置操作一个,但我不确定它们需要多少堆
  • 在 my_cache.put 中提供值提示无济于事
  • cache.clear(), cache.destroy() 没有帮助(它不应该,因为缓存不在堆上)

任何帮助将不胜感激!

  1. 默认情况下,Apache Ignite 不在堆上保存数据,而是在堆外保存数据。
  2. 当数据被删除时,Apahce Ignite 确实不会释放堆外,但它允许在摄取新数据时重新使用所述堆外。
  3. 完全不清楚为什么您的工具会报告使用 ~16G 堆,因为 Ignite 不应该使用提供的配置超过几百 MB。 如果这不仅仅是堆而是所有 RAM,那么就可以了。 您应该预期应该分配 10G。 为什么它在 Size 字段中报告更多尚不清楚。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM