Erlang 的抽象机器 BEAM 中使用了哪些操作系统线程?

Posted

技术标签:

【中文标题】Erlang 的抽象机器 BEAM 中使用了哪些操作系统线程?【英文标题】:What OS threads get used in Erlang’s abstract machine, BEAM? 【发布时间】:2011-04-09 11:51:45 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

这是 AFAIK,基本场景:

Erlang 代码将在尽可能多的环境中运行 “绿色线程”,因为有 流程;进程限制是 由 +P(命令行)标志控制。

绿色线程映射到 S 线程,其中 S 是线程数 核心/CPU。 这些事实 线程也称为调度器 看起来有点 令人困惑,但从虚拟机的角度来看 认为他们是。 来自开发者的 观点,他们是线程 运行您的 erlang 代码。这 数字 S 可以控制 erl 命令行的 +S 选项。

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

所以,你在一个上看到的 11 个线程 双核可能是 2 个调度器和 9 个 异步线程。例如。

阅读更多关于标志here的信息。

【讨论】:

【参考方案2】:

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

【讨论】:

@user425720 - 感谢您的回复和这些链接。我认为有关调度程序数量(无论如何默认情况下)与内核数量相关的信息是正确的。但是和你一样,我仍然无法推测为什么在我的双核机器示例中有 11 个线程。还是很吸引人... @Alan 继续在 erlang-questions 邮件列表中提问。 OTP 团队和核心 VM 开发人员不断阅读它! @user425720 - 好主意。我不知道那个名单。这是我第一次提出让 Stack Overflow 用户感到困惑的问题。我会报告 erlang-questions 列表中的结果。

以上是关于Erlang 的抽象机器 BEAM 中使用了哪些操作系统线程?的主要内容,如果未能解决你的问题,请参考以下文章

如何限制 Erlang VM (BEAM) 使用的核心数量?

重新编译Erlang的beam_disasm.file的输出

erlang beam code文件怎么打开

BEAM(Erlang VM)是一种啥样的虚拟机?

Erlang学习记录:app demo

Erjang —— 让你在 Java 中执行 Erlang 程序