Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance Neo4j 2.0.0-虚拟机中的开发/测试性能较差_Performance_Neo4j_Cypher - Fatal编程技术网

Performance Neo4j 2.0.0-虚拟机中的开发/测试性能较差

Performance Neo4j 2.0.0-虚拟机中的开发/测试性能较差,performance,neo4j,cypher,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_

我使用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} } )
当前执行时间超过170ms(这是平均值,第一次查询时间为700ms)。在测试运行期间,VM中的CPU从未超过50%,内存使用率稳定在1.4Gb

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

其他详细信息

我使用Go 1.2对
cypher
端点(
http://localhost:7474/db/data/cypher
)本地安装的Neo4j实例。我正在将内容类型的请求头设置为“application/json”,将accept设置为“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的三个调用是相同的参数化查询。虽然创建是一个大问题,但我也有点担心Neo4j在数据库中只有100个节点的情况下,需要4ms才能找到一个标记的节点


我不会在测试运行之间重新启动服务器或删除数据库。我在测试运行结束时发出一个deleteallnodes查询
MATCH(n)OPTIONAL MATCH(n)-[r]()delete n,r
。背靠背多次运行同一测试套件并不能提高查询时间。

您的100个查询都是相同的,只是参数不同,还是实际上是100个不同的查询

您看到的实际上是安装工作。解析器必须首先加载解析规则,这需要几毫秒的时间。此外,还将编译、规划尚未看到的新查询,并将其放入查询缓存中

因此,第一个查询总是需要更长的时间。但是,当您参数化之后,所有后续的参数都应该是快速的

你能证实吗

我想您看到了将事务刷新到磁盘的方法

您是否尝试将多个请求批处理到一个请求中?即,使用事务端点?或者/db/data/batch(但我更愿意使用新的tx端点/db/data/transaction)

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

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

刚刚用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和30毫秒之间的每个请求外部包括开始卷曲

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
可能是虚拟机(磁盘或网络)还是跨虚拟机通信

对两个端点进行了另一个ab测试和1000个请求,两次的平均值都是5毫秒


测试套件中的查询大多是唯一的,但我一遍又一遍地运行相同的测试套件,这应该会缓存执行计划(我希望?)。在启动Neo4j后的测试套件的第一次运行中,基本创建可能需要700毫秒,后续运行需要170毫秒。第一次运行700毫秒似乎仍然很长,但如果后续运行速度很快,我可以接受。在这段时间内,你会重新启动服务器吗?你用什么样的司机?还是您自己调用其余端点?如果这是2.0,我建议使用事务端点。也许您可以分享更多关于如何执行查询的详细信息?我已经在上面的问题中添加了一些详细信息。如果我删除标签,则不会有任何更改。我并没有尝试进行大型数据导入,我只是尝试插入2个节点和1个关系,这些都是在一个Cypher查询中完成的。没有什么可批处理的。有没有办法告诉Neo4j不要刷新到磁盘?此外,我还为validate查询的lookup属性创建了一个索引。每个测试同步运行单个密码查询,然后在继续下一个测试之前验证结果。这是针对web服务的,所以这也是它在生产中的工作方式-我不能等待一堆请求进入并尝试在响应之前批处理它们。