嵌入式neo4j崩溃且没有堆栈跟踪

4
我正在使用Java API嵌入式运行neo4j 2.3.0-RC1,但它会在没有任何警告的情况下崩溃,我正在尝试找出问题所在。之前我曾成功地运行过这段代码,使用的是1.9.8。升级到2.0+需要添加事务、修改一些Cypher语法、启动Spring配置和少量其他更改。大部分代码仍然相同,并且功能正确,通过单元测试和集成测试进行了确认。启动引擎后,它会以相当恒定的速度添加新的节点。以下输出显示在290分钟后发生了神秘的崩溃。它似乎总是会发生,有时在2小时后,有时在5小时后。而使用1.9.8就没有发生过这种情况。JVM是用./start-engine.sh > console.out 2>&1 &来运行的。而start-engine.sh的操作行是:
$JAVA_HOME/bin/java -server $JAVA_OPTIONS $JPROFILER_OPTIONS -cp '.:lib/*' package.engine.Main $*

以下是console.out的最后几行。
17437.902: RevokeBias                       [     112          6              5    ]      [    20     6    27    43    26    ]  1
17438.020: RevokeBias                       [     112          3              9    ]      [     5     0     5     0     0    ]  3
17438.338: GenCollectForAllocation          [     113          2              2    ]      [     1     0    11     4    32    ]  2
17438.857: BulkRevokeBias                   [     112          3             13    ]      [     0     0    28     6     2    ]  3
./start-engine.sh: line 17: 19647 Killed                  $JAVA_HOME/bin/java -server $JAVA_OPTIONS $JPROFILER_OPTIONS -cp '.:lib/*' package.engine.Main $*

没有堆栈跟踪,也没有其他错误输出。

这是来自/mnt/engine-data目录下messages.log的最后几行。

2015-10-30 18:07:44.457+0000 INFO  [o.n.k.i.t.l.c.CheckPointerImpl] Check Pointing triggered by scheduler for time threshold [845664646]:  Starting check pointing...
2015-10-30 18:07:44.458+0000 INFO  [o.n.k.i.t.l.c.CheckPointerImpl] Check Pointing triggered by scheduler for time threshold [845664646]:  Starting store flush...
2015-10-30 18:07:44.564+0000 INFO  [o.n.k.i.s.c.CountsTracker] About to rotate counts store at transaction 845664650 to [/mnt/engine-data/neostore.counts.db.b], from [/mnt/engine-data/neostore.counts.db.a].
2015-10-30 18:07:44.565+0000 INFO  [o.n.k.i.s.c.CountsTracker] Successfully rotated counts store at transaction 845664650 to [/mnt/engine-data/neostore.counts.db.b], from [/mnt/engine-data/neostore.counts.db.a].
2015-10-30 18:07:44.834+0000 INFO  [o.n.k.i.t.l.c.CheckPointerImpl] Check Pointing triggered by scheduler for time threshold [845664646]:  Store flush completed
2015-10-30 18:07:44.835+0000 INFO  [o.n.k.i.t.l.c.CheckPointerImpl] Check Pointing triggered by scheduler for time threshold [845664646]:  Starting appending check point entry into the tx log...
2015-10-30 18:07:44.836+0000 INFO  [o.n.k.i.t.l.c.CheckPointerImpl] Check Pointing triggered by scheduler for time threshold [845664646]:  Appending check point entry into the tx log completed
2015-10-30 18:07:44.836+0000 INFO  [o.n.k.i.t.l.c.CheckPointerImpl] Check Pointing triggered by scheduler for time threshold [845664646]:  Check pointing completed
2015-10-30 18:07:44.836+0000 INFO  [o.n.k.i.t.l.p.LogPruningImpl] Log Rotation [35826]:  Starting log pruning.
2015-10-30 18:07:44.844+0000 INFO  [o.n.k.i.t.l.p.LogPruningImpl] Log Rotation [35826]:  Log pruning complete.

在崩溃之前,一切看起来都很正常,而崩溃则完全出乎意料。

messages.log中有大量其他数据,但我不知道要找什么。


$ java -version
java version "1.7.0_65"
Java(TM) SE Runtime Environment (build 1.7.0_65-b17)
Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode)

$uname -a
Linux 3.13.0-65-generic #106-Ubuntu SMP Fri Oct 2 22:08:27 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

1
这个问题在官方的2.3.0发布版本中发生吗? - cybersam
版本 2.3.0 由于 http://stackoverflow.com/questions/33351632/cause-of-neo4j-indexoutofboundsexception-on-getrelationships-again 的原因未能通过单元测试 / 集成测试。 - Stewart
1
你有JVM核心转储文件或JVM hs_err文件吗? - sibnick
以前遇到过内存不足的崩溃问题,但没有出现这种特定的症状。:( - Stewart
1个回答

6
您可能正在经历Linux Out-of-Memory Killer的影响,当系统的物理内存严重不足时,它会杀死进程。这可以解释为什么您在日志中找不到任何内容。
引用这篇优秀的文章
由于许多应用程序预先分配其内存并且通常不使用分配的内存,因此内核设计了超额承诺内存的能力,以使内存使用更加高效。……当太多应用程序开始利用它们被分配的内存时,超额承诺模型有时会出现问题,内核必须开始杀死进程……
上述引用的文章是了解OOM Killer的好资源,并包括大量关于如何排除故障和配置Linux以尝试避免问题的信息。
引用这个问题的答案:
OOM Killer必须选择最佳要杀死的进程。这里的“最佳”指的是在杀死后释放最大内存且对系统最不重要的进程。
由于neo4j进程很可能是您的系统上最耗费内存的进程,所以当物理资源开始耗尽时,它被杀死是有道理的。
避免OOM Killer的一种方法是尝试让其他内存密集型进程远离同一系统。这应该会使内存超额承诺的可能性大大降低。但是您至少应该阅读上述第一篇文章,以更好地了解OOM Killer-需要知道很多内容。

这很有趣。“Killed中的大写K表示该进程被使用-9信号杀死”,好吧,这是第一个线索,因为上面的Killed语句确实有一个大写K。 - Stewart
奖励已发放。我尚未确认此行为是否来自OOM Killer,但这似乎是有道理的,并且链接的文章提供了许多诊断工具,这些工具将在任何情况下都非常有用。 - Stewart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接