Neo4j Java VM 调优(v2.3 社区)

Neo4j Java VM Tuning (v2.3 Community)

据我所知,我的 Neo4j v2.3 社区存在问题Java VM 将项目添加到老一代堆中,但永远无法对它们进行垃圾收集。

这里是详细的情况概要。

我有一个 PHP 文件,它调用 Dropbox Delta API 并将文件结构写到我的 Neo4j 数据库中。每次调用 Delta returns 一个 2000 个项目数据集,我从中提取我需要的信息,下面是一个查询看起来像只有一个项目的例子,通常我发送整批 2000 个项目作为它给了我最好的结果。

***Following is an example Query***
MERGE (c:Cloud { type:'Dropbox', id_user:'15', id_account:''})
WITH c
UNWIND [
    { parent_shared_folder_id:488417928, rev:'15e1d1caa88',.......}
    ] 
AS items MERGE (i:Item { id:items.path, id_account:'', id_user:'15', type:'Dropbox' })
ON Create SET i = { id:items.path, id_account:'', id_user:'15', is_dir:items.is_dir, name:items.name, description:items.description, size:items.size, created_at:items.created_at, modified:items.modified, processed:1446769779, type:'Dropbox'}
ON Match  SET i+= { id:items.path, id_account:'', id_user:'15', is_dir:items.is_dir, name:items.name, description:items.description, size:items.size, created_at:items.created_at, modified:items.modified, processed:1446769779, type:'Dropbox'}
MERGE (p:Item {id_user:'15', id:items.parentPath, id_account:'', type:'Dropbox'})
MERGE (p)-[:Contains]->(i)
MERGE (c)-[:Owns]->(i)


***The query is sent via Everyman****

static function makeQuery($client, $qry) {
    return new Everyman\Neo4j\Cypher\Query($client, $qry);
}

这很好用,通常从开始到结束需要 8-10 秒 运行。

我正在访问的 Dropbox 帐户包含大约 35000 个项目,我的 PHP 大约需要 18 运行 秒来使用 Dropbox 帐户的 folder/file 结构填充我的 Neo4j 数据库.

对于此 PHP 中的每个 运行,大约有 50mb 的项目被添加到 Neo4j JVM Old Gen 堆中,其​​中 30mb 未被 GC 删除。

最终结果显然是 VM 运行 内存不足,并陷入 GC 节流的持续状态。

我尝试了一系列 Neo4j VM 设置,以及从 Neo4j v2.2.5 到 v2.3 的更新,这实际上似乎使问题变得更糟。

我目前的设置如下,

-server
-Xms4096m
-Xmx4096m
-XX:NewSize=3072m
-XX:MaxNewSize=3072m
-XX:SurvivorRatio=1

我正在 windows 10 PC 上进行测试,配备 8GB 内存和 i5 2.5GHz 四核。 Java1.8.0_60

如能提供有关如何解决此问题的任何信息,我们将不胜感激。 干杯,杰克。

将新尺寸缩小到 1024 米

将您的设置更改为:

-server
-Xms4096m
-Xmx4096m
-XX:NewSize=1024m

很有可能是您的交易量太大了。

我建议分别发送每个 parents,而不是 UNWIND 分别发送一个语句。

确保使用新的事务性 http 端点,我建议使用 neoclient 而不是 Neo4jPHP

你也应该使用参数而不是文字值!!!

并且不要在每个项目上重复用户 ID 和类型等属性。

您确定要将所有内容都连接到 c 而不仅仅是目录结构的根目录吗?我会选择后者。

MERGE (c:Cloud:Dropbox { id_user:{userId}})

MERGE (p:Item:Dropbox {id:{parentPath}})
// owning the parent should be good enough
MERGE (c)-[:Owns]->(p)

WITH c
UNWIND {items} as item
MERGE (i:Item:Dropbox { id:item.path})
ON Create SET i += { is_dir:item.is_dir, name:item.name, created_at:item.created_at }
SET i += { description:item.description, size:item.size, modified:items.modified, processed:timestamp()}
MERGE (p)-[:Contains]->(i);

确保使用 2.3.0 以获得关系的最佳 MERGE 性能。