Neo4j离谱写作表现

时间:2016-11-29 15:49:32

标签: java neo4j

我正在使用新的bolt客户端对neo4j 3.0.7进行性能测试,我看到了一些奇怪的结果。 我尝试了一个非常简单的场景:upserting 1000个节点(使用merge命令)。

我尝试了几种方法:

  1. 1个命令的1000个同步事务
  2. 1000个命令的1个交易
  3. 1个命令的1000个异步事务(使用10个线程)
  4. 这是我正在执行的查询(我对person.id有唯一性约束):     "合并(n:person {id:' 123'})SET n.name =' Diana Kesha',n.address =' aaa' ....返回n.id"

    以下是我的查询的执行计划:

    Execution plan

    结果如下:

    1. 每1000次同步交易约3秒(注意不是1000k)
    2. 每1000个命令的1个事务
    3. ~2sec
    4. 〜每1000次异步事务2.5秒
    5. 对于配备128G RAM机器的64核心来说,这是绝对不可接受的结果!

      现在,深入一点, 我注意到Neo4j使用了25%的RAM(我认为这很好),但在使用前2个选项时仅使用 1 核心,在使用10个线程时使用10个核心。

      我也注意到改变Neo4j的工作线程并没有影响使用的实际内核数量。

      我错过了什么?

1 个答案:

答案 0 :(得分:1)

你有两个相互矛盾的数字,你的意思是1000还是1000k = 1M?

1M更新的2秒太慢了?

我建议每个tx进行1k到10k的更新,然后并行化tx

  1. 您没有使用参数
  2. 不要退货
  3. 使用大写标签(适应约束)
  4. 像:

    MERGE (n:Person {id:{id}}) 
     ON CREATE SET n.name={name} n.address={address}
    

    最好将(2)批处理为列表参数

    UNWIND {data} as row 
    MERGE (n:Person {id:row.id}) 
    ON CREATE SET n.name=row.name n.address=row.address
    

    因此,测试1000个请求(并行),每个请求1000个更新,每次发送一个包含1000个映射的列表。

    UNWIND {data} as row 
    MERGE (n:Person {id:row.id}) 
    ON CREATE SET n.name=row.name n.address=row.address