【问题标题】:Restarting an Erlang node after a segmentation fault分段错误后重新启动 Erlang 节点
【发布时间】:2013-11-23 09:58:56
【问题描述】:

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

监控 Erlang 应用程序并在虚拟机死机时重新启动它的最佳方法是什么?

【问题讨论】:

    标签: c erlang erlang-shell erlang-ports


    【解决方案1】:

    你想看看Heart

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

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

    NIF 的原因 -> 替换

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

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

    【讨论】:

      【解决方案2】:

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

      1. 它不是特定于 erlang 的,所以如果你在同一个盒子上还有其他东西,你可以用它来重新启动东西
      2. 心脏可以有一些weird behavior 防止崩溃转储。
      3. 如果您出于某种原因确实想要停止 erlang 进程,supervisord 可以让这更容易。
      4. 如果在启动时出现段错误,heart will continue to restart erlang infinitely。在尝试一定次数后,Supervisord 将停止尝试重新启动。

      【讨论】:

      • 此外,heart 实际上未能正确启动我的节点,使用最初用于启动它的相同命令行。不知道为什么,我也没有时间去追查。
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-02-09
        • 2011-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-29
        • 2013-09-22
        相关资源
        最近更新 更多