1

我很高兴在我的系统上使用以下配置的 neo4j 1.8.1 社区版一段时间。

系统规格:

  • 操作系统:32 位 Ubuntu 12.04.3 LTS。内核版本 3.2.0-52-generic-pae #78-Ubuntu
  • 内存:4GB
  • 交换:8GB(交换文件 - 不是分区)
  • 处理器:Intel® Core™ i5-2430M CPU @ 2.40GHz - 四核
  • 硬盘:500GB 希捷 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 就不会更新。

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

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

    Xms 和 Xmx 为 1GB。GC 到 Concurrent-Mark-Sweep。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

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

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 之前的下一个最近稳定版本),一切恢复正常

4

1 回答 1

3

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

因此,为了获得最佳性能,我建议以下几点:

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

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

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

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

在一个密码查询中创建一千个节点不应超过几毫秒。就每秒可以发送多少个密码语句而言,在我的笔记本电脑上和从 python(使用https://github.com/jakewins/neo4jdb-python),我在并发设置中每秒收到大约 10 000 个密码语句( 10 个客户)。

于 2014-04-02T09:16:50.537 回答