了解Erlang的可伸缩性

时间:2013-09-22 12:45:28

标签: concurrency erlang

据说可以产生数千个进程来同时执行类似的任务,而Erlang善于处理它。如果还有更多的工作要做,我们可以简单安全地添加更多的工作流程,并使其具有可扩展性。

我无法理解的是,如果每项工作所执行的工作本身就是资源密集型的,那么Erlang将如何处理它呢?例如,如果条目由多个源构成一个表,并且一个Erlang应用程序使用其数百个进程从表中读取行并执行某些操作,这显然可能会导致资源负担。每个工人都会尝试从表中提取记录。 如果这是一个错误的示例,请考虑一个必须在内存中执行高CPU密集型计算的工作程序。成千上万的这类工人同时运行会使CPU过度工作。

请纠正我对Erlang中可伸缩性的理解: 只有在有可用的工作时,Erlang进程才会获得CPU的时间片。另一方面,OS进程获得时间片,而不管它们是否空闲。 Erlang进程的启动和关闭时间远低于OS进程。

除了以上两点之外,还有一些关于Erlang的东西可以扩展吗?

谢谢, 梅尔文

1 个答案:

答案 0 :(得分:3)

在Erlang中扩展不是自动的。 Erlang语言和运行时提供了一些工具,使编写并发程序变得相对容易。如果这些是正确编写的,那么它们可以沿着几个不同的维度进行缩放:

  • 在多个核心上并行执行 - 因为虚拟机能够理解所有核心的使用。
  • 容量 - 因为每个任务都可以进行处理并且重量轻。

最大的优势是Erlang进程是孤立的,就像操作系统一样,但与操作系统不同,通信开销很小。这两个特性是你想在Erlang编程中利用的。

如果您要定位高并行执行,那么您需要避免使用具有高度争用的数据资源的问题。解决问题的最佳方法是将问题分开,以免发生。

我有一篇博客文章http://jlouisramblings.blogspot.dk/2013/01/how-erlang-does-scheduling.html,其中详细介绍了Erlang调度程序的工作原理。你可能想读一下。