首页 > 解决方案 > Neo4j 本地与云的性能差异

问题描述

我在 VirtualBox 托管的 VM 上运行的本地 Neo4j 实例与在 Google Cloud (GCP) 中托管的基本相同的 Neo4j 实例之间遇到了巨大的性能差异。该任务涉及从同样位于 GCP 中的 Postgres 实例执行简单加载。整个负载在 VirtualBox 托管的 VM 实例上需要 1-2 分钟,在 GCP VM 实例上需要 1-2 小时。本地硬件设置是 10 年前运行 VirtualBox 6.1 的 8 核 16GB 桌面。

我使用 VirtualBox 和 GCP 执行这些类似的任务:

  1. 配置一个 4 核、8GB 的​​ Ubuntu 18 LTS 实例

  2. 安装 Neo4j 社区版 4.0.2

  3. 使用 wget 将最新的 apoc 和 postgres jdbc jar 下载到插件目录中

  4. (仅在 GCP 中,neo4j.conf 文件从默认值更改。我取消注释“dbms.default_listen_address=0.0.0.0”行以允许非本地主机连接。还创建了相应的 GCP 防火墙规则)

  5. 重启neo4j服务

  6. 安装并启动 htop 和 iotop 进行硬件监控

  7. 通过浏览器控制台登录到空的 Neo4j 实例

  8. 加载 jdbc 驱动程序并运行加载语句

load 语句使用 apoc.periodic.iterate 调用 apoc.load.jdbc。我在两种环境中都将“batchSize”参数从 100 到 10000 改变了,但在这两个系统中都只看到了微小的变化。“parallel”参数设置为 false,因为 true 会导致锁定错误。

观察网络 I/O,两者都需要前约 15-25 秒从数据库表中提取约 700k 行(8 列)。观察 CPU,两者都将一个核心保持在 100% 的最大值,而另一个核心则在 0-100% 之间变化。观察内存,两者都不超过 4GB,swap 保持在 0。最初,我确实使用了“neo4j-admin memrec”中的配置建议,但这些似乎并没有显着改变内存使用或整体执行时间。

看盘,就是有区别的地方。但我认为这些只是症状而非根本原因:本地 VM 在整个执行时间(1-2 分钟)内始终以 1-2 MB/s 的速度写入。GCP VM 突发写入 300-400 KB/s,每 20-30 秒持续 1 秒。但我不认为 GCP 磁盘很慢或问题(我已经尝试过 GCP 的标准磁盘和他们的 SSD 磁盘)。如果 GCP 磁盘很慢,我预计会看到持续的写入活动和巨大的写入磁盘队列。似乎每当应该将某些内容写入磁盘时,它都会在 GCP 中快速完成。似乎瓶颈在磁盘写入之前。

我能想到的只是我使用了 10 年的内核比当前的 GCP vCPU 快得多,或者发生了一些内存堆问题。除了堆很重要并且可能很挑剔之外,我对 java 了解不多。

标签: google-cloud-platformneo4jvirtual-machine

解决方案


你在两个系统上都有完全相同的 :schema 吗?如果您缺少 LOAD 查询中使用的关键索引,该索引可以轻松解释您所看到的差异。

例如,如果您通过某个属性在节点上使用 MATCH 或 MERGE,这就是通过索引快速查找节点或对该标签的所有节点执行标签扫描检查每一个节点之间的区别一个来查看节点是否存在或者它是否是正确的节点。还要理解这个过程对每一行都重复,所以在最坏的情况下,它不是一个标签扫描,而是 n 倍。


推荐阅读