2014-09-19 86 views
2

我有一个拥有超过200万节点的neo4j系统(2.0.1版本)。它是一个具有不同类型的实体和节点的社交网络,具有高基数节点(2000个喜欢和500个关注用户的追随者)。neo4j查询的高响应时间

我在Amazon AWS EC2 c3.2xlarge,8核16GB RAM上运行系统。我有一个运行在同一台服务器上的mongodb实例。

但是,一旦在2-3天没有CPU使用率,响应时间任何明显的跳直线上升,简单索引查询,如发现通过指数需要10秒,而不是〜100毫秒。

我无法找到确切的问题。我正在提供Neo4j的messages.log文件,请检查是否存在任何明显的错误。

messages.log file

UPDATE: 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

Mongo将使用机器上所有可用的内存(如果需要),因此推测可能是服务器运行时内存使用率较高。但是,你可以分享Neo4j配置/ java配置吗?在你的messages.log中,你可以看到许多应用程序阻塞了很多秒的例子。 – JohnMark13 2014-09-19 10:41:37

+0

您可以在日志文件中看到GC停止的持续时间。您经常需要短暂停止GC(100-200ms),但每隔一段时间(5-10秒)停止一次,这会阻止您的实例并缩短您的响应时间,因为它必须等待GC停止完成。您应该尝试调整您的堆/caché配置以找到您的用例的最佳位置。 – albertoperdomo 2014-09-19 10:43:49

+0

我也害怕它可能与垃圾收集器一起,试着把一些监视器,看看是否会出现问题。 – ulkas 2014-09-19 12:11:59

回答

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设置,这将是有帮助的也有一个如何你在内存映射方面配置新的想法?此外,磁盘上neostore文件的大小(只需查看您的图形目录)。

您已经将JVM设置为使用高达10Gb的RAM,并为您的操作系统,内存映射和Mongo留下6Gb,这足够吗?

快速查看Neo documentation中的推荐设置可以发现,在2百万个节点上,您需要512Mb的Heap。显然,这是一个经验法则,每个节点上存储的数据量以及关系数据量都会对此产生明显影响。

使用Neo4J calculator我插入了2000000个节点,10000000个关系,每个关系有100字节的数据,并且它建议使用12Gb RAM运行带有6Gb堆的JVM的机器。读取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 

显然有一个权衡上堆存储,内存映射,然后磁盘高速缓存和磁盘访问之间互取至少比我慢一个数量级(我认为),但垃圾收集是昂贵的,特别是当堆很大时。

+0

请看看我们的neostore文件大小和内存映射设置。 我将搬出mongo到另一台服务器,并切换到配置的IOPs亚马逊卷类型。 堆已经逐渐增加,因为之前我们观察到由于全部GC未成功释放堆而导致CPU使用率过高 – poorvankBhatia 2014-09-20 06:30:01

+0

因此,您的设置为所有数据提供了充足的空间。我想知道你是否在填充某些查询(你能分享你运行的任何查询吗?),当堆填满时,你分析了它是什么充满的(jvisualvm对此很好用)?无论你做什么,10Gb的执行速度都会很慢。 – JohnMark13 2014-09-22 08:58:01