我有一个拥有200多万个节点的neo4j系统(2.0.1版本)。它是一个具有不同类型的实体和节点的社交网络,具有高基数节点(2000个用户和500个高级用户)。
我在亚马逊AWS EC2 c3.2xlarge,8核16GB RAM上运行系统。我在同一台服务器上运行了一个mongodb实例。
但是一旦在2-3天没有任何明显的CPU使用量跳跃,响应时间快速上升,简单的索引查询如查找按索引需要10s而不是~100ms
我无法查明确切的问题。我正在提供Neo4j的 messages.log 文件,请检查是否存在任何明显的错误。
更新 JVM设置如下:
wrapper.java.additional=-XX:+UseConcMarkSweepGC
wrapper.java.additional=-XX:+CMSClassUnloadingEnabled
wrapper.java.additional=-XX:NewRatio=1
wrapper.java.additional=-XX:SurvivorRatio=32
wrapper.java.additional=-XX:MaxPermSize=100m
wrapper.java.additional=-d64
wrapper.java.additional=-server
wrapper.java.additional=-Xss4096k
wrapper.java.additional=-Xloggc:data/log/neo4j-gc.log
wrapper.java.additional=-XX:+PrintGCDetails
wrapper.java.additional=-XX:+PrintGCDateStamps
wrapper.java.additional=-XX:+PrintGCApplicationStoppedTime
# Initial Java Heap Size (in MB)
wrapper.java.initmemory=10240
# Maximum Java Heap Size (in MB)
wrapper.java.maxmemory=10240
更新2 :我的Neostore文件:
$ ls -lht *store*
-rw-rw-r-- 1 ubuntu ubuntu 63 Sep 20 11:50 neostore
-rw-rw-r-- 1 ubuntu ubuntu 576M Sep 20 11:50 neostore.propertystore.db
-rw-rw-r-- 1 ubuntu ubuntu 282M Sep 20 11:50 neostore.relationshipstore.db
-rw-rw-r-- 1 ubuntu ubuntu 1.1G Sep 20 11:50 neostore.propertystore.db.strings
-rw-rw-r-- 1 ubuntu ubuntu 32M Sep 20 11:50 neostore.nodestore.db
-rw-rw-r-- 1 ubuntu ubuntu 549K Sep 20 11:11 neostore.relationshipstore.db.id
-rw-rw-r-- 1 ubuntu ubuntu 3.9K Sep 18 16:35 neostore.propertystore.db.index.keys
-rw-rw-r-- 1 ubuntu ubuntu 927 Sep 18 16:35 neostore.propertystore.db.index
-rw-rw-r-- 1 ubuntu ubuntu 9 Sep 18 11:21 neostore.id
内存映射设置如下:
neostore.nodestore.db.mapped_memory=100M
neostore.relationshipstore.db.mapped_memory=400M
neostore.propertystore.db.mapped_memory=800M
neostore.propertystore.db.strings.mapped_memory=1536M
答案 0 :(得分:2)
由于存在很多变量,很难将其作为答案,但很可能是你的堆太大了。我看到你有GC日志设置,你看过文件data/log/neo4j-gc.log
。
重要的是,你的messages.log可以看到垃圾收集事件发生的事情变慢了,一个特别糟糕的补丁在2分钟以内的时间内被GC阻止了大约80秒(我想你停止了服务器)不久之后)。
2014-09-18 05:45:09.323+0000 WARN [o.n.k.EmbeddedGraphDatabase]: GC Monitor: Application threads blocked for an additional 21640ms [total block time: 5232.321s]
2014-09-18 05:45:33.694+0000 WARN [o.n.k.EmbeddedGraphDatabase]: GC Monitor: Application threads blocked for an additional 19016ms [total block time: 5251.337s]
2014-09-18 05:45:57.579+0000 WARN [o.n.k.EmbeddedGraphDatabase]: GC Monitor: Application threads blocked for an additional 18985ms [total block time: 5270.322s]
2014-09-18 05:46:22.333+0000 WARN [o.n.k.EmbeddedGraphDatabase]: GC Monitor: Application threads blocked for an additional 19929ms [total block time: 5290.251s]
您已经提供了JVM设置,了解如何根据内存映射配置Neo会有所帮助吗?此外,磁盘上的neostore文件的大小(只需查看图表目录)。
你已经将JVM设置为使用高达10Gb的RAM,让你为操作系统,内存映射和Mongo留下6Gb就足够了吗?
快速查看Neo documentation中的推荐设置会显示,在2百万个节点上,您需要512Mb的堆。显然,这是一个经验法则,您存储在每个节点上的数据量以及关系数据量将明显影响这一点。
使用Neo4J calculator我插入2000000个节点,10000000个关系,每个关系100个字节的数据,它建议一台机器运行带有6Gb堆的JVM的12Gb RAM。阅读memory mapping configuration我想你会想要尝试将3.5Gb映射到你的数据集明智分割的图形数据。使用那里的例子:
neostore.nodestore.db.mapped_memory=45M
neostore.relationshipstore.db.mapped_memory=3G
neostore.propertystore.db.mapped_memory=50M
neostore.propertystore.db.strings.mapped_memory=100M
neostore.propertystore.db.arrays.mapped_memory=0M
这是基于他们的粗略计算:
number_of_nodes * 9 bytes
number_of_relationships * 33 bytes
在堆存储,内存映射以及磁盘缓存和磁盘访问之间显然存在权衡,每个都至少慢一个数量级(我认为),但垃圾收集很昂贵,尤其是当堆很多时大。