5

我目前正在运行一个通过 Nifs 运行 C 代码的 Erlang 应用程序。但是,如果 C 代码中出现分段错误,则整个节点以及运行 Erlang 应用程序的 Erlang 虚拟机都会关闭。

如果虚拟机死机,监视 Erlang 应用程序并重新启动它的最佳方法是什么?

4

3 回答 3

3

你想看看Heart

此外,如果您有被认为危险的 NIF 调用,建议将它们与靠近它们的 Erlang 代码一起隔离在单独的节点上。有几种方法可以监视和重新启动节点(例如Slave)。

但是,一般来说,我建议不要使用有问题的 NIF,这取决于您使用它们的目的,有更稳定的替代方案。

NIF 的原因 -> 替换

顺序速度 -> 更好优化的 Erlang 代码。通常,NIF 的高顺序速度是以它们与 Erlangs 调度程序混淆为代价的,这通常会导致实际性能更差。

与外部库/应用程序接口 -> Erlangs 端口在故障隔离方面要好得多

于 2013-11-11T15:26:24.933 回答
3

我使用了一种叫做supervisord的东西。与心脏相比的一些优势:

  1. 它不是特定于 erlang 的,所以如果你在同一个盒子上有其他东西,你可以用它来重新启动东西
  2. Heart 可能有一些奇怪的行为来防止崩溃转储。
  3. 如果你出于某种原因真的想停止 erlang 进程,supervisord 会让这更容易。
  4. 如果启动时出现segfault,heart会继续无限重启erlang。在尝试一定次数后,Supervisord 将停止尝试重新启动。
于 2013-11-11T16:45:04.900 回答
1

如果你想以 Erlang 的方式来做,你可以使用上面提到的任何解决方案(心脏,supervisord)。如果你想以 Unix 方式来做,首先你应该让你的 Erlang 应用程序表现为 Unix 守护进程。

为此使用erld。接下来你可以做一件熟悉的事情:监控/重启熟悉的 Unix 守护进程。

于 2013-11-14T12:13:27.583 回答