我有多个在Windows机器上运行的Erlang VM。我想预分配每个VM使用的cpu核心数。对于实例VM1应该仅使用2个内核,VM2应该使用其他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
参数一起传递给elixir
或iex
:
iex --erl "+S 2 +sbt db"