Neo4j 2.0.0 - 虚拟机中dev / test的性能不佳

时间:2014-01-15 18:45:12

标签: performance neo4j cypher

我使用Ubuntu 13.10在虚拟机内运行Neo4j服务器,我使用Cypher查询通过REST访问。虚拟机分配了4 GB的内存。

我已将打开文件数更改为40000,将初始JVM堆设置为1G,我的neo4j.properties文件如下:

neostore.nodestore.db.mapped_memory=250M
neostore.relationshipstore.db.mapped_memory=100M
neostore.propertystore.db.mapped_memory=100M
neostore.propertystore.db.strings.mapped_memory=100M
neostore.propertystore.db.arrays.mapped_memory=100M

keep_logical_logs=3 days

node_auto_indexing=true
node_keys_indexable=id

我还根据Neo4j Linux调优指南更新了sysctl:

vm.dirty_background_ratio = 50
vm.dirty_ratio = 80

由于我正在测试查询,基本例程是运行我的测试套件,然后删除所有节点并再次运行它们。在每次测试运行开始时,数据库中都有0个节点。我的大约100个查询的测试套件需要22秒才能运行。基本参数化创建如:

CREATE (x:user { email: {param0},
  name: {param1},
  displayname: {param2},
  id: {param3},
  href: {param4},
  object: {param5} })
CREATE x-[:LOGIN]->(:login { password: {param6},
  salt: {param7} } )

目前正在执行超过170毫秒(这是平均值,第一个查询时间是700毫秒)。在测试运行期间,VM中的CPU永远不会超过50%,内存使用率将稳定在1.4Gb。

为什么在空数据库中创建单个节点需要170毫秒?此时单元测试变得几乎不可能,因为它太慢了。这是我第一次尝试调整Neo4j,所以我不确定如何找出问题所在或应该做出哪些改变。

其他详细信息

我正在使用Go 1.2对本地安装的Neo4j实例的cypher端点(http://localhost:7474/db/data/cypher)进行REST调用。我将内容类型的请求标头设置为“application / json”,接受“application / json”和“X-Stream”为true。我总是返回一个地图数组或根本不返回任何内容。

似乎创造是问题,并且正在永远。例如:

2014/01/15 11:35:51 NewUser took 123.314938ms
2014/01/15 11:35:51 NewUser took 156.101784ms
2014/01/15 11:35:52 NewUser took 167.439442ms
2014/01/15 11:35:52 ValidatePassword took 4.287416ms

NewUser创建两个新节点和一个关系,占用167ms,而ValidatePassword是一个只读操作,它在4ms内完成。另请注意,对NewUser的三次调用是相同的参数化查询。虽然创建是一个大问题,但我还是有点担心,当数据库中只有100个节点时,Neo4j需要4ms才能找到标记的节点。

我不会在测试运行之间重新启动服务器或删除数据库。我在测试运行结束时发出单个删除所有节点查询MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n,r。连续多次运行相同的测试套件不会缩短查询时间。

1 个答案:

答案 0 :(得分:2)

您的100个查询是否仅使用不同的参数,或实际上是100个不同的查询?

您看到的实际上是设置工作。解析器最初必须加载解析规则需要几毫秒。此外,尚未查看的新查询将被编译,计划并放入查询缓存中。

所以第一个查询总是需要更长的时间。但是,当您对所有后续参数进行参数化时,应该很快。

你能证实吗?

我认为你看到将事务刷新到磁盘的transactional overhea d。

您是否尝试将更多请求批量合并为一个?即使用事务端点?或者/ db / data / batch(但我宁愿使用新的tx-endpoint / db / data / transaction)。

您是否为验证查询的查找属性创建了索引?

你可以帮我一个忙,并在没有标签的情况下测试你的创建查询吗?本周早些时候我自己测试时发现了一些性能问题。

刚刚用curl运行测试

for i in `seq 1 10`; do time curl -i -H content-type:application/json -H accept:application/json -H X-Stream:true -d @perf_test.json http://localhost:7474/db/data/cypher; done

我在外部请求每次请求16到30ms,包括启动curl

HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8; stream=true
Access-Control-Allow-Origin: *
Transfer-Encoding: chunked
Server: Jetty(9.0.5.v20130815)

{"columns":[],"data":[]}
real    0m0.016s
user    0m0.005s
sys 0m0.005s

或许它更像是VM(磁盘或网络)或跨vm通信?

对两个端点进行了另外一次ab和1000次请求的测试,两次都得到了大约5 ms的平均值。

https://gist.github.com/jexp/8452037