18

我已经开始研究 Erlang 并发现 BEAM 运行时环境很吸引人。通常说在 Erlang 中,进程属于语言而不是操作系统(意思是运行时,在这种情况下是 BEAM)。这些是 Erlang 出名的轻量级“绿色流程”。进一步说明(在本文的第 5 页),BEAM 使用每个 CPU 内核的一 (1) 个 OS 线程进行调度,并使用另一个 OS 线程进行 i/o。所以我想知道:实际执行 Erlang 代码所需的 CPU 周期来自哪个线程?

此外,如果我在双核机器上运行,我希望——根据我目前所读的内容——看到三 (3) 个线程在 BEAM 进程下运行:两个调度程序(每个内核一个)和一个 i/o 线程。但我看到 10。有时是 11。有时它从 13 开始,就像高质量的放大器一样,到 11。

我很困惑。任何见解将不胜感激。

4

2 回答 2

10

根据@user425720 的建议,我在 erlang-questions LISTSERV 上提出了问题。它也可以作为Google Group使用。Trifork 的 Kresten Krab Thorup 几乎立刻就回答了我。谢谢你去克雷斯顿。这是他的答案。(括号和重点是我的。)

这是AFAIK,基本场景:

Erlang 代码将在与进程一样多的“绿色线程”中运行;进程限制由 +P(命令行)标志控制。

绿色线程映射到 S 个线程,其中 S 是内核/CPU 的数量。这些线程也被称为调度程序这一事实 似乎有些令人困惑,但从 VM 的角度来看,它们确实如此。 从开发人员的角度来看,它们是运行您的 erlang 代码的线程。数字 S 可以通过 erl 命令行的 +S 选项来控制。

除此之外,还有许多所谓的“异步线程”。这是一个线程池,由驱动程序中称为链接的 I/O 进程使用,以对选择/轮询等做出反应。异步线程的数量是动态的,但受 +A 标志的限制。

因此,您在双核上看到的 11 个线程可能是 2 个调度程序和 9 个异步线程。例如。

在此处阅读有关标志的更多信息。

于 2010-09-14T13:02:42.080 回答
7

Erlang 进程不是“绿色”的,因为线程在 java 中是绿色的。Erlang 进程是不共享内存的结构,它们由 Erlang VM 维护。

听起来可能很奇怪,但这篇论文可能是“旧的”(即使是 2007 年的生物)。当我们对运行时队列进行全新的处理(使用动态平衡和其他好东西)时,这一切在 R13 版本中都发生了变化。这是 Ulf Wiger 关于它的一些介绍http://ulf.wiger.net/weblog/2009/01/23/erlang-programming-for-multicore/

总而言之,进程是完全透明的,您可以调整运行时队列和调度程序的数量,但操作系统的实现并不完整。我不想推测为什么会有 11 个线程..

编辑:我对操作系统有点错误:

+S Schedulers:SchedulerOnline

当启用 SMP 支持时,设置要创建的调度程序线程的数量和要在线设置的调度程序线程的数量。

这两个值的有效范围是 1-1024。如果 Erlang 运行时系统能够确定配置的逻辑处理器数量和可用的逻辑处理器,调度程序将默认为配置的逻辑处理器,SchedulersOnline并将默认为可用的逻辑处理器;否则,默认值为 1。如果不是,则可以省略调度程序:SchedulerOnline,反之亦然。在线调度程序的数量可以在运行时通过erlang:system_flag(schedulers_online, SchedulersOnline).

...

如果模拟器没有启用 SMP 支持,则此标志将被忽略(请参阅-smp标志)。

从这里:http ://www.erlang.org/doc/man/erl.html

EDIT2:关于许多 VM 与许多调度程序的优缺点的 erlang-question 邮件列表的有趣讨论。不幸的是,它也是从 2008 年开始的,并且可能不适用于新 OTP 版本的巨大改进。http://www.erlang.org/cgi-bin/ezmlm-cgi?4:mss:38165:200809:nbihpkepgjcfnffkoobf

于 2010-09-08T10:23:45.517 回答