Neo4j 2.0.1企业版:性能问题

时间:2014-04-02 04:18:33

标签: performance neo4j system graph-databases database-tuning

我很高兴在我的系统上使用neo4j 1.8.1社区版,但配置如下。

系统规格:

  • 操作系统:32位Ubuntu 12.04.3 LTS。内核版本3.2.0-52-generic-pae#78-Ubuntu
  • 内存:4GB
  • 交换:8GB(交换文件 - 不是分区)
  • 处理器:英特尔®酷睿™i5-2430M CPU @ 2.40GHz - 四核
  • Harddisk :500GB Seagate ATA ST9500420AS。双启动 - Ubuntu使用100GB,其余由全能的Windows 7使用。

当我切换到neo4j 2.0.1企业版时,我的应用程序的响应时间变慢了4倍。因此,正如http://docs.neo4j.org/chunked/stable/embedded-configuration.html中所建议的,我开始调整我的文件系统,虚拟内存,I / O调度和JVM配置。

性能调整

  • 将Neo4j作为具有最高调度优先级的服务器启动(漂亮的值= -20)

  • 在/etc/sysctl.conf中设置vm.dirty_background_ratio = 50和vm.dirty_ratio = 80,以减少频繁将脏内存页面刷新到磁盘。

  • 根据Neo4j启动建议,将打开文件的最大数量从1024增加到40,000。

  • 为/ etc / fstab中的neo4j ext4分区设置noatime,nodiratime,以便每次有文件/目录访问时都不会更新inode。

  • 将“cfop”中的I / O scheular更改为“noop”,如中所述 http://www.cyberciti.biz/faq/linux-change-io-scheduler-for-harddisk/

  • JVM参数:简而言之,最大堆大小为1GB,neostore内存映射文件大小为425 MB。

    Xms和Xmx到1GB。    GC到并行标记扫描。    neostore.nodestore.db.mapped_memory = 25M,    neostore.relationshipstore.db.mapped_memory = 50M    neostore.propertystore.db.mapped_memory = 90M    neostore.propertystore.db.strings.mapped_memory = 130M    neostore.propertystore.db.arrays.mapped_memory = 130M

可悲的是,这并没有任何区别。我写了一个简单的脚本,在这些节点之间创建了N个节点和M个随机关系,以获得更好的画面。

Neo4j 1.8.1社区版与oracle java版“1.6.0_45”:

new-sys-admin@ThinkPad:~/temp$ php perftest.php    
Creating 1000 Nodes with index 
Time taken : 67.02s

Creating 4000 relationships 
Time taken : 201.27s

Neo4j 2.0.1企业版与oracle java版“1.7.0_51”:

new-sys-admin@ThinkPad:~/temp$ php perftest.php 
Creating 1000 Nodes with index 
Time taken : 75.14s

Creating 4000 relationships 
Time taken : 206.52s

以上结果是在2次预热运行之后。 2.0.1结果似乎比1.8.1慢。任何有关调整相关配置以提升neo4j 2.0.1性能的建议都将受到高度赞赏。

编辑1

所有查询都是使用Gremlin通过Everyman Neo4j包装器发出的。

http://grokbase.com/p/gg/neo4j/143w1fen8c/gremlin-plugin-extremely-slow-on-neo4j-2-0-1

与此同时,我转到了neo4j-enterprise-edition-1.9.6(2.0.1之前的下一个稳定版本),事情又恢复了正常

1 个答案:

答案 0 :(得分:3)

由于您使用的是PHP,并且看到只创建了1000个节点是67秒,我假设您正在使用常规REST API(例如POST / db / data / node)。如果这是正确的,那么对于这些​​CRUD操作,2.0.1比1.8慢一些百分点可能是正确的。在2.0中,我们专注于优化Cypher和新的事务端点。

因此,为了获得最佳性能,我建议这些:

  1. 使用新的事务端点/ db / data / transaction

  2. 使用cypher,并使用它在“一次性”中将尽可能多的工作发送到服务器

  3. 如果可能,请在同一个HTTP请求中发送多个cypher查询,您也可以通过事务端点执行此操作。

  4. 如果可以,请确保重新使用TCP连接,我不确定它在PHP中是如何工作的,但是发送“Connection:Keep-alive”标头并确保重新使用相同的tcp连接节省了大量开销,因为您不必反复重建TCP连接。

  5. 在一个cypher查询中创建一千个节点不应超过几毫秒。根据您每秒可以发送的cypher语句数量,在我的笔记本电脑和python上(使用https://github.com/jakewins/neo4jdb-python),我在并发设置(10个客户端)中每秒获得大约10 000个cypher语句。