【发布时间】:2019-01-15 17:25:05
【问题描述】:
我有多个 Erlang 虚拟机在 Windows 机器上运行。我想预先分配每个 VM 使用的 cpu 核心数。对于实例 VM1 应仅使用 2 个内核,VM2 应使用其他 2 个内核。
请帮忙
【问题讨论】:
我有多个 Erlang 虚拟机在 Windows 机器上运行。我想预先分配每个 VM 使用的 cpu 核心数。对于实例 VM1 应仅使用 2 个内核,VM2 应使用其他 2 个内核。
请帮忙
【问题讨论】:
我不建议这样做,因为 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 使用多少个内核,使用 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 参数一起传递给 elixir 或 iex:
iex --erl "+S 2 +sbt db"
【讨论】: