我很高兴在我的系统上使用以下配置的 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 之前的下一个最近稳定版本),一切恢复正常