1

我已经在 8GB 和 4 核的 Ubuntu 16.04 虚拟机 (Hyper-V) 中安装了 Neo4J v3.3.0(社区版)。

我有一个非常小的图表(30 个节点),它仅用于读取(大约每 3 秒点击 1 次),它很少被写入。我们想进一步扩展图表,但每三天(有时更少)我们的服务器就会崩溃,因为 Java 占用了超过 2GB 的内存,而顶部显示了 300% 的 CPU 使用率。

对我来说这根本没有意义,你能否让我知道如何配置 Java 或 Neo4J 以防止这种情况发生?

谢谢

我的/etc/neo4j/neo4j.conf文件中有以下配置:

dbms.query_cache_size=5000
dbms.threads.worker_count=4
dbms.memory.heap.initial_size=2g
dbms.memory.heap.max_size=2g

dbms.memory.pagecache.size=2g

发生这种情况时,日志文件会显示以下错误:

ERROR [o.n.b.v.r.c.RunnableBoltWorker] Worker for session 'ecfe4a7f-1714-4ba3-9e98-a692bf153b45' crashed. Java heap space java.lang.OutOfMemoryError: Java heap space

还有这些可疑消息(有很多):

WARN [o.n.k.i.c.MonitorGc] GC Monitor: Application threads blocked for 4680ms.

ERROR [o.n.b.v.t.BoltMessagingProtocolV1Handler] Failed to write response to driver Unable to write to the closed output channel org.neo4j.bolt.v1.packstream.PackOutputClosedException: Unable to write to the closed output channel

WARN [io.netty.channel.DefaultChannelPipeline] An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception. syscall:read(..) failed: Connection reset by peer

新的信息

我做了一个:

netstat -an | grep ESTABLISHED

我有很多开放的连接。我们在 nodeJS ( https://github.com/neo4j/neo4j-javascript-driver )中使用以下 javascript 驱动程序。将检查我们是否没有正确检查连接。

看来我正确地关闭了所有连接:

session.close();
driver.close();

在我退出应用程序之前,连接仍然保持打开状态。

最后的评论

我的代码中有一个地方我没有关闭连接。

https://github.com/neo4j/neo4j-javascript-driver/issues/275

4

1 回答 1

2

我可以说,Neo4j 在 8GB RAM 上运行良好,具有 1000 万个节点和 3000 万个关系,无需特殊调整。

top 可能在垃圾收集完成时显示 300% 的 CPU 使用率。所以我投票赞成增加堆大小

/etc/neo4j/neo4j.conf

范围

dbms.memory.heap.max_size=3g

在较大的数据库上,高 CPU 消耗意味着没有索引。

列出索引:

CALL db.indexes();

创建一个:

CREATE INDEX ON :Label(prop_name);

如果您遇到 OOM 错误(请参阅 dmesg)并且 java 被 linux 杀死(不是崩溃),请尝试安装服务器操作系统,例如没有 GUI的CentOS等,以释放一些内存。对于具有 8-10GB 大小的数据库的 Neo4j,8GB 绰绰有余。

于 2017-11-21T09:17:51.413 回答