【问题标题】:Multiple Erlang VMs running on Windows Server, how to pre-allocate cpu cores to each VM在 Windows Server 上运行多个 Erlang VM,如何为每个 VM 预分配 cpu 内核
【发布时间】:2019-01-15 17:25:05
【问题描述】:

我有多个 Erlang 虚拟机在 Windows 机器上运行。我想预先分配每个 VM 使用的 cpu 核心数。对于实例 VM1 应仅使用 2 个内核,VM2 应使用其他 2 个内核。

请帮忙

【问题讨论】:

    标签: erlang elixir


    【解决方案1】:

    我不建议这样做,因为 OS 可能是安排可在 CPU 上高效运行的进程的最佳选择,而更改此设置可能没有真正帮助(应由性能基准测试确定)。

    仅使用 Erlang VM 标志无法完成。 对于 Windows 特定的查看此example

    以下是仅限 Windows 的命令。

    cmd.exe START /affinity 3 erl +S 2
    cmd.exe START /affinity B erl +S 2
    

    Affinity 3 (x0011) 仅在 CPU0 和 1 中运行 Erlang VM OS 进程。 Affinity B (x1100) 仅在 CPU2 和 3 中运行 Erlang VM OS 进程。

    erl +S 2 运行 2 个调度程序线程,操作系统可以在 2 个 CPU 上运行。这将有效地利用 CPU,因为运行更多可能会导致上下文切换,而运行更少可能会导致资源利用率不足

    【讨论】:

    • 在我的例子中:第一个 erlang VM 必须运行一个长时间运行的进程,而第二个 VM 有多个小型运行进程。我不想因为第一个 VM 上的长时间运行进程而饿死第二个 VM,这就是为什么我想为每个 VM 预分配 CPU
    【解决方案2】:

    最简单的做法是告诉 Erlang VM 使用多少个内核,使用 the +S option:

    erl +S 2
    

    之所以称为S,是因为 Erlang VM 每个内核使用一个 s调度程序。

    默认情况下,调度程序不绑定到任何核心。您可以使用erlang:system_info(scheduler_bindings) 进行检查:

    3> erlang:system_info(scheduler_bindings).
    {unbound,unbound}
    

    您可以通过传递参数+sbt db 让 Erlang VM 将调度程序绑定到内核,但如果您在同一台机器上运行多个 VM,这会适得其反,因为它们会绑定到相同的内核。因此,您还需要使用 +sct option 来使用自定义 CPU 拓扑。首先,弄清楚 Erlang VM 认为的实际拓扑是什么。这是关于我的笔记本电脑的说明:

    2> erlang:system_info({cpu_topology,detected}).
    [{processor,[{core,[{thread,{logical,0}},
                        {thread,{logical,4}}]},
                 {core,[{thread,{logical,1}},{thread,{logical,5}}]},
                 {core,[{thread,{logical,2}},{thread,{logical,6}}]},
                 {core,[{thread,{logical,3}},{thread,{logical,7}}]}]}]
    

    所以让我们将第一个 VM 绑定到逻辑线程 0 和 4,分别在线程 0 和 1 上,都在处理器 0 的核心 0 上:

    erl +S 2 +sbt db +sct L0T0C0P0:L4T1C0P0
    

    让我们将第二个虚拟机绑定到逻辑线程 1 和 5,在处理器 0 的核心 1 的线程 0 和 1 上:

    erl +S 2 +sbt db +sct L1T0C1P0:L5T1C1P0
    

    如果您使用 Elixir,您可以将所有这些选项与 --erl 参数一起传递给 elixiriex

    iex --erl "+S 2 +sbt db"
    

    【讨论】:

    • 实际上它是一个长生不老的虚拟机,而不是 erlang。那会改变这个命令吗:erl +S 2 +sbt db +sct L0T0C0P0:L4T1C0P0
    • @nitinjain110588 没有 elixir VM 这样的东西。
    • 我更新了答案以展示如何使用 Elixir 进行此操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多