首页 > 解决方案 > 带有高度顶点的 JanusGraph OOM 异常

问题描述

这是一个关于在java.lang.OutOfMemoryError: GC overhead limit exceeded对 JanusGraph 执行操作时观察到的问题的问题。

设置

我正在运行0.2.0以 Cassandra 作为底层存储的 JanusGraph 版本。我正在使用此处描述的默认配置值,但将我的存储后端描述为cql存储主机的配置除外。

我在图表中插入了大量用户 - 每个用户都有 (1) 一封电子邮件,(2) 一个用户 ID,以及 (3) 一个关联的分组标签。对于这种情况,所有用户都在同一个分组中,我们称之为groupA. 插入是按顺序完成的,每个插入在前一个完成后立即执行。

在每次插入操作期间,我创建一个代表电子邮件的顶点,一个代表用户 ID 的顶点,然后创建或更新代表groupA. 我在 (1) 电子邮件 <-> 用户 ID 顶点和 (2) 用户 ID <-> 顶点之间创建一条边groupA

观察到的问题

我使用分析器来观察过程中的堆空间使用情况。插入在开始时运行没有问题,但随着更多的插入,使用的堆空间增加。最终,随着更多内存的使用,我在运行几个小时后遇到了内存不足的异常。

--

然后我第二次重复插入,但这次我没有包括groupA顶点。这一次,内存使用随着时间的推移呈现出标准的锯齿模式,如下所示。

从插入中删除组顶点的堆使用情况

这使我得出结论,我观察到的内存不足问题是由于涉及这个高度groupA顶点的操作。

潜在线索

我目前怀疑 JanusGraph 上有一些缓存过程,用于存储最近访问的元素。由于高度组顶点的邻接列表很大,因此可能会缓存大量数据,这只会随着我从组顶点到用户 ID 顶点创建越来越多的边而增加。

使用我的分析器,我注意到org.janusgraph.graphdb.relations.RelationCache该类的内存使用量相对较高,因此这似乎是相关的。

我的问题

我的问题是:随着时间的推移,JanusGraph 的内存使用率越来越高的原因是什么?

标签: out-of-memoryjanusgraph

解决方案


考虑频繁提交。当您插入数据时,它们会保存在事务缓存中,直到事务提交。另外,请查看您的数据库缓存配置。您将在此处找到有关缓存的更多信息。


推荐阅读