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

Posted

技术标签:

【中文标题】如何限制 Erlang VM (BEAM) 使用的核心数量?【英文标题】:How to limit the number of cores used by the Erlang VM (BEAM)? 【发布时间】:2012-10-31 02:36:23 【问题描述】:

我正在使用 2 个四核 Xeon E5520 2.2GHz、24.0GB RAM 和 Erlang R15B02(启用 SMP)的节点上运行实验。我想知道是否可以限制 Erlang VM 使用的核心数量,以便我可以暂时禁用一些核心并逐步增加数量以测试可扩展性。

我在此节点上没有root 访问权限。所以我期待一些方法,要么通过指定参数到erl,要么通过 Erlang 代码。

【问题讨论】:

【参考方案1】:

您可以通过 +S 选项将 Erlang 使用的内核数限制为 erl,这允许您设置 Erlang 创建的调度程序内核线程数。有关详细信息,请参阅erl man page。

请注意,Erlang linked-in port drivers 和 native implemented functions (NIF) 都可以创建自己的线程,因此会影响 Erlang 进程将使用的内核数量,而与通过 +S 选项指定的线程无关,尽管没有标准驱动程序或 NIF 执行此操作。此外,+Aerl 选项创建了一个异步线程池供驱动程序使用,这也可能影响使用的内核数量,默认情况下异步线程池有 10 个线程(在 Erlang/ 之前默认为空) OTP 版本 R16B)。

【讨论】:

谢谢!您能否解释一下+S 4:2+S 2:2 之间的区别(即Schedulers 大于SchedulerOnline)? +S 2:2 表示您需要两个调度程序并且您希望它们都在线。 +S 4:2 表示您需要四个调度程序,但您只需要其中两个在线。另请注意,在运行时,您的应用程序可以通过erlang:system_info/1erlang:system_flag/2 函数检查和更改调度程序和在线调度程序的数量;有关详细信息,请参阅 system_info/1 和 system_flag/2 的文档。 但是由于在线调度器的数量相同,那么不同的Schedulers值有什么影响呢? 我之前的评论有点误导,所以这可能是你困惑的原因。应该说erlang:system_info/1允许你检查调度器的数量和在线调度器的数量,erlang:system_flag/2允许你改变在线调度器的数量。这两个数字是不同的:调度程序的数量是您运行 Erlang VM 时可用的最大数量,并且在启动时固定。在线调度器的数量可以从1到调度器的数量;您可以通过erlang:system_flag/2 更改它。默认情况下,数字是相同的。 请注意,我在 2013 年提交了一个补丁,为 Erlang/OTP 版本 R16B02(2013 年 9 月发布)接受,为erl 添加一个+SP 选项。此选项允许您按百分比而不是绝对数字设置调度程序和在线调度程序的数量。例如,+SP 75:50 在 24 核系统上将调度器的数量设置为 18(24 的 75%),将在线调度器的数量设置为 12(24 的 50%)。详情请见the erl man page。

以上是关于如何限制 Erlang VM (BEAM) 使用的核心数量?的主要内容,如果未能解决你的问题,请参考以下文章

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

更改Erlang文件句柄限制?

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

erlang beam code文件怎么打开

erlang如何使用一个OS线程实现抢占式调度?

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