Neo4J调整还是更多内存?

时间:2014-04-09 09:32:37

标签: performance neo4j cypher ram

我有一台Neo4J企业数据库,运行在具有8Gb RAM和80Gb SSD的DigitalOcean VPS上。 Neo4J实例的性能目前很糟糕:

match (n) where n.gram='0gram' AND n.word=~'a.' return n.word LIMIT 5 @ 349ms 
match (n) where n.gram='0gram' AND n.word=~'a.*' return n.word LIMIT 25 @ 1588ms

我理解正则表达式很昂贵,但同样在我用任何其他字母替换'a.''a.*'部分的查询中,Neo4j只是崩溃了。在此之前,我可以看到内存中的大量增加(达到90%),并且CPU飙升。

我的Neo4j填充如下:

Number Of Relationship Type Ids In Use: 1,
Number Of Node Ids In Use: 172412046,
Number Of Relationship Ids In Use: 172219328,
Number Of Property Ids In Use: 344453742

VPS只运行Neo4J(在debian 7 / amd64上)。我使用NUMA + parallelGC标志,因为它们应该更快。我一直在调整我的RAM设置,虽然它现在经常没有崩溃,但我觉得应该有一些收获要做

neostore.nodestore.db.mapped_memory=1024M
neostore.relationshipstore.db.mapped_memory=2048M
neostore.propertystore.db.mapped_memory=6144M
neostore.propertystore.db.strings.mapped_memory=512M
neostore.propertystore.db.arrays.mapped_memory=512M

# caching
cache_type=hpc
node_cache_array_fraction=7
relationship_cache_array_fraction=5
# node_cache_size=3G
# relationship_cache_size=1G  --> these throw a not-enough-heap-mem error

数据本质上是一系列树,其中node0只需要进行全文搜索,以下节点由具有浮点值的属性搜索。

node0 -REL-> node0.1 -REL-> node0.1.1 ... node0.1.1.1.1
      \
       -REL-> node0.2 -REL-> node0.2.1 ... node0.2.1.1

有aprox。 5.000个顶级节点,如node0

我应该重新配置我的内存/缓存使用情况,还是应该添加更多内存?

---编辑索引---

因为节点的所有树都是4层深,所以每个级别都有一个标签可以快速查找。在这种情况下,所有node0个节点都有一个标签(称为0gram)。 n.gram='0gram'应该使用与标签耦合的索引。

---编辑新配置---

我将VPS升级到16Gb。 nodeStore具有2.3Gb(11%),PropertyStore 13.8Gb(64%),SSD上的relastionshipStore达到5.6Gb(26%)。 在此基础上,我创建了一个新的配置(详见上文)。 我正在等待全套查询,并会在同一时间进行一些额外的测试

2 个答案:

答案 0 :(得分:5)

是的,你需要创建一个索引,你的标签叫什么?想象一下它被称为:NGram

create index on :NGram(gram);

match (n:NGram) where n.gram='0gram' AND n.word=~'a.' return n.word LIMIT 5

match (n:NGram) where n.gram='0gram' AND n.word=~'a.*' return n.word LIMIT 25

您正在做的不是图搜索,而只是通过全扫描查找+与正则表达式进行属性比较。不是一个非常有效的操作。你需要的是FullTextSearch(新模式索引不支持,但仍然使用旧索引)。

您是否可以运行此查询(在创建索引之后)并说明它返回了多少个节点?

match (n:NGram) where n.gram='0gram' return count(*)

相当于

match (n:NGram {gram:'0gram'}) return count(*)

我几天前写了blog post about it,请仔细阅读,看看它是否适用于您的情况。

你的Neo4j数据库在磁盘上有多大? 配置的堆大小是多少? (在neo4j-wrapper.conf?)

正如您所看到的,您使用的内存比机器多(甚至不计算操作系统或文件系统缓存)。

所以你必须减少mmio尺寸,例如节点2G用于500s,用于rels,1G用于属性。

查看商店文件大小并相应地设置mmio。

答案 1 :(得分:4)

根据具有n.gram='0gram'的节点数量,您可以通过在gram属性上设置标签和索引来获益良多。如果你有这个,索引查找将直接返回所有0gram个节点,并仅对这些节点应用正则表达式匹配。您当前的语句将从db加载每个节点并检查其属性。