[英]Possible Memory leak in Apache Ignite?
我试图将 Ignite 用作键值对的内存数据库,其值范围从 50MB 到 800MB。 看起来 Ignite 通过它永远不会清理的 JVM 分配堆空间,即使缓存条目不在堆中,被清除,没有连接的客户端,也没有正在运行的操作。 我的机器无法处理这种内存消耗,因此我正在寻找一种清理内存的方法。
我的测试场景如下:
我正在使用 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 邮件列表后,我确实得到了我的问题的答案。 显然,Ignite 从未打算在单个查询中消耗如此大量的数据。 所描述的行为是预期的,并且与将数据分成包并将其发送到其他节点或将其放入持久性有关。 建议的解决方案是将数据分成更小的位。 由于目前在我的情况下这是不可能的,因此我放弃了 Ignite 并寻找其他方法来存储我的数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.