Windows Server上运行的多个Erlang VM,如何为每个VM预分配CPU核心

时间:2019-01-08 22:18:11

标签: erlang elixir elixir-framework

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

请帮助

2 个答案:

答案 0 :(得分:3)

我不建议您这样做,因为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,因为运行更多的CPU可能会导致上下文切换,而运行更少的CPU可能会导致资源利用率不足

答案 1 :(得分:3)

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

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

然后将第二个VM绑定到处理器0核心1的线程0和1上的逻辑线程1和5:

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

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

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