Apache Ignite 中可能存在内存泄漏?
Possible Memory leak in Apache Ignite?
我正在尝试将 Ignite 用作内存数据库,用于值范围从 50MB 到 800MB 的键值对。看起来 Ignite 通过 JVM 分配堆 space 它永远不会清理,即使缓存条目不在堆中,被清除,没有连接的客户端也没有 运行ning 操作。我的机器无法处理这种内存消耗,因此我正在寻找一种清理内存的方法。
我的测试场景如下:
- 点燃版本 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 左右:
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>
- ignite visor 特别指出缓存是堆外的
- VisualVM 直方图表示 98% 的活动字节映射到 byte[]
- 似乎有 client-connector 和 data-streamer-stripe 线程保持打开状态,缓存中的每个 put 操作一个,但我不确定它们需要多少堆
- 在 my_cache.put 中提供值提示没有帮助
- cache.clear(), cache.destroy() 没有帮助(它不应该,因为缓存在堆外)
非常感谢任何帮助!
- Apache Ignite 默认不在堆上保存数据,相反,它将保存数据 off-heap。
- Apahce Ignite 在删除数据时确实不会释放 off-heap,但在摄取新数据时它会允许 re-use 表示 off-heap。
- 完全不清楚为什么您的工具会报告使用了 ~16G 堆,因为 Ignite 在提供的配置下不应使用超过几百 MB。如果那不仅是堆而且是所有 RAM,那么您就可以了。您应该期望分配 10G。为什么它在 Size 字段中报告更多不清楚。
很抱歉让任何感兴趣的人耽搁了这么久,但在联系 Ignite 邮件列表后,我确实得到了问题的答案。显然,Ignite 从来没有打算在单个查询中消耗如此大量的数据。所描述的行为是预期的,并且与将数据分成包并将其发送到其他节点或将其放入持久性有关。建议的解决方案是将数据分块成更小的位。由于目前在我的情况下这是不可能的,所以我放弃了 Ignite 并寻找其他方法来存储我的数据。
我正在尝试将 Ignite 用作内存数据库,用于值范围从 50MB 到 800MB 的键值对。看起来 Ignite 通过 JVM 分配堆 space 它永远不会清理,即使缓存条目不在堆中,被清除,没有连接的客户端也没有 运行ning 操作。我的机器无法处理这种内存消耗,因此我正在寻找一种清理内存的方法。
我的测试场景如下:
- 点燃版本 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 左右:
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>
- ignite visor 特别指出缓存是堆外的
- VisualVM 直方图表示 98% 的活动字节映射到 byte[]
- 似乎有 client-connector 和 data-streamer-stripe 线程保持打开状态,缓存中的每个 put 操作一个,但我不确定它们需要多少堆
- 在 my_cache.put 中提供值提示没有帮助
- cache.clear(), cache.destroy() 没有帮助(它不应该,因为缓存在堆外)
非常感谢任何帮助!
- Apache Ignite 默认不在堆上保存数据,相反,它将保存数据 off-heap。
- Apahce Ignite 在删除数据时确实不会释放 off-heap,但在摄取新数据时它会允许 re-use 表示 off-heap。
- 完全不清楚为什么您的工具会报告使用了 ~16G 堆,因为 Ignite 在提供的配置下不应使用超过几百 MB。如果那不仅是堆而且是所有 RAM,那么您就可以了。您应该期望分配 10G。为什么它在 Size 字段中报告更多不清楚。
很抱歉让任何感兴趣的人耽搁了这么久,但在联系 Ignite 邮件列表后,我确实得到了问题的答案。显然,Ignite 从来没有打算在单个查询中消耗如此大量的数据。所描述的行为是预期的,并且与将数据分成包并将其发送到其他节点或将其放入持久性有关。建议的解决方案是将数据分块成更小的位。由于目前在我的情况下这是不可能的,所以我放弃了 Ignite 并寻找其他方法来存储我的数据。