【发布时间】:2014-01-15 18:45:12
【问题描述】:
我有 Neo4j 服务器在使用 Ubuntu 13.10 的虚拟机中运行,我正在使用 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 调用。我将 content-type 的请求标头设置为“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 创建两个新节点和一个关系,耗时 167 毫秒,而 ValidatePassword 是只读操作,完成时间为 4 毫秒。另请注意,对 NewUser 的三个调用是相同的参数化查询。虽然创建是个大问题,但我也有点担心当数据库中只有 100 个节点时,Neo4j 需要 4 毫秒才能找到一个标记的节点。
我不会在测试运行之间重新启动服务器或删除数据库。我在测试运行结束时发出一个删除所有节点查询MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n,r。背靠背多次运行相同的测试套件并不会缩短查询时间。
【问题讨论】:
-
在下面扩展了我的答案。
标签: performance neo4j cypher