Neo4j 1.9.4(REST服务器,CYPHER)性能问题

时间:2013-11-08 15:51:38

标签: performance neo4j neo4jphp

我在24核24Gb ram(centos)计算机上安装了Neo4j 1.9.4,对于大多数查询,只有少量并发请求,CPU使用率达到200%。

某种社交应用程序,其中少数类型的节点(配置文件)具有3-30个文本/数组属性,36个关系类型具有至少3个属性。大多数节点目前有大约300-500个关系。

当前数据集占用空间(来自控制台):

LogicalLogSize=4294907 (32MB)
ArrayStoreSize=1675520 (12MB)
NodeStoreSize=1342170 (10MB)
PropertyStoreSize=1739548 (13MB)
RelationshipStoreSize=6395202 (48MB)
StringStoreSize=1478400 (11MB)

这是恕我直言,真的很小。 大多数查询看起来都像这样(带有或多或少的WITH .. MATCH ..语句和几个具有可变长度关系但通常很快的查询):

START
    targetUser=node({id}),
    currentUser=node({current})
MATCH
    targetUser-[contact:InContactsRelation]->n,
    n-[:InLocationRelation]->l,
    n-[:InCategoryRelation]->c
WITH
    currentUser, targetUser,n, l,c, contact.fav is not null as inFavorites
MATCH
    n<-[followers?:InContactsRelation]-()
WITH
    currentUser, targetUser,n, l,c,inFavorites, COUNT(followers) as numFollowers
RETURN
    id(n) as id,
    n.name? as name,
    n.title? as title,
    n._class as _class,
    n.avatar? as avatar,
    n.avatar_type? as avatar_type,
    l.name as location__name,
    c.name as category__name,
    true as isInContacts,
    inFavorites as isInFavorites,
    numFollowers

它运行在~1s-3s(第一次运行)和~1s-70ms(连续且它取决于查询)并且每次展示大约有5-10个查询运行。另一个有趣的行为是当我尝试连续多次从我的本地机器上的控制台(neo4j)运行查询时(只需按ctrl +输入几秒钟)它几乎一直执行时间但是当我在服务器上执行时它会以指数方式变慢猜它与我的问题有某种关系。

问题:

所以我的问题是neo4j非常贪婪(对于24核心机器来说,它可能不是问题,但对于小项目来说显然有点过分了)。我第一次使用AWS EC2 m1.large实例但是在所有性能上都不好,在测试期间,CPU总是超过100%。

配置的一些相关部分:

neostore.nodestore.db.mapped_memory=1280M
wrapper.java.maxmemory=8192

注意:我已经尝试过所有内存相关参数的配置,其中HIGH和它没有工作(根本没有变化)。

问题:

在哪里挖?组态?方案?疑问?我做错了什么?

如果需要更多信息(日志,配置),只需询问;)

1 个答案:

答案 0 :(得分:0)

通过使用缓存可以很容易地解释后续调用相同查询的速度更快的原因。常见的策略是在启动时运行缓存预热查询,例如

start n=node(*) match n--m return count(n)

24核上200%的CPU使用率意味着机器非常懒,因为只有2个核心正忙。当查询正在进行时,CPU在运行时会达到100%是正常的。

上面的Cypher语句使用可选匹配(在第二个匹配子句中)。这些可选匹配被认为可能很慢。如果您将此选项设置为非可选匹配项,请检查运行时是否更改。

当返回更大的结果集时,请考虑传输响应是由网络速度驱动的。考虑在案例中使用流媒体,请参阅http://docs.neo4j.org/chunked/milestone/rest-api-streaming.html

您还应将wrapper.java.minmemory设置为与wrapper.java.maxmemory相同的值。

您的相当小的图表的另一种方法是关闭MMIO缓存并使用cache_type=strong将完整数据集保留在对象缓存中。在这种情况下,您可能需要增加wrapper.java.minmemorywrapper.java.maxmemory