【发布时间】:2015-12-27 02:09:04
【问题描述】:
Erlang Interoperability 指南讨论了不同的互操作性机制。以下是我的结论:
端口和 Erl_Interface 程序:操作系统调度,限制可扩展性。
端口驱动程序:危险,因为端口驱动程序崩溃会导致 模拟器也关了。
C 节点:节点服务器需要像 Erlang 应用程序一样扩展以避免 可扩展性牺牲。
NIF:Loic 总和 他们很好。
有些人主张使用 OpenCL,基本上将资源匮乏的计算委托给 GPU,同时让 Erlang 模拟器拥有 CPU。这听起来棒极了,但您的服务器需要有合适的 GPU。
使用 JInterface 并与为每个请求生成一个线程的 Java 进程通信可能是一种选择。
那么有没有人遇到过经过实践测试并证明效果很好的解决方案?
【问题讨论】:
-
您链接到的 NIF 的描述看起来已经过时且不准确。例如,在调度程序上运行“超过几微秒”的 NIF 不会导致问题;仅当 NIF 运行超过几毫秒时才会发生这种情况。此外,
enif_schedule_niffunction 提供了一种很好的方法来分解长 NIF 以避免调度程序问题,加上实验性的dirty scheduler functionality NIF 可以运行任意时间,而不会导致调度程序打嗝。 -
要使用脏调度器功能,您需要构建模拟器并启用实验性脏调度器支持。我认为运行具有实验功能的生产代码的想法不会有很多爱好者。一般来说,NIF 似乎有点危险。正如 Loic 指出的那样,它们可能会使您的虚拟机崩溃。在 Windows 下编译使用它们的库是一场噩梦——我不喜欢在 Windows 上运行 Erlang。
-
实验性的脏调度器功能有一天会成为常规功能,希望在 Erlang 19 中。我为 Erlang/OTP 实现了脏调度器功能,并在启用它的情况下运行所有 Erlang 17 和 18 虚拟机,并且没有任何问题。另外,请参阅these measurements,它显示了将进程切换到脏调度程序所涉及的少量开销。
标签: erlang scalability erlang-ports erlang-driver jinterface