假设我正在使用4核CPU机器。
如果我在我的elixir VM中运行以下命令:
1..4 |> Enum.map fn(x) -> spawn(computationally_heavy_process) end
这是否使用我机器的所有4个核心。每个计算繁重的过程之一?
答案 0 :(得分:15)
是。默认情况下,Erlang为每个CPU启动一个调度程序(OS线程),并尝试在调度程序之间均匀分配负载。但是,不能保证四个进程最终在四个不同的CPU中处理,因为通常会有更多的事情并行发生。如果您想知道Erlang已启动了多少个调度程序,请启动iex
(或erl
,就此而言。)
~$ iex
Erlang/OTP 17 [erts-6.4] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
...
例如,我的计算机有一个8核的CPU。在输出的第一行,您可以看到当前配置。从[smp:8:8]
部分,您可以看到SMP配置了8个调度程序,其中8个在线。可以使用the +S
flag覆盖调度程序/线程的数量。
+ S调度程序:SchedulerOnline
设置要创建的调度程序线程数和调度程序线程数 在启用SMP支持时设置在线。两者的最大值 值为1024.如果Erlang运行时系统能够确定 配置的逻辑处理器数量和逻辑处理器 可用,Schedulers将默认配置逻辑处理器, 和SchedulersOnline将默认为逻辑处理器可用; 否则,默认值为1. [...]
在线调度程序的数量也可以在运行时通过:erlang.system_flag(:schedulers_online, n)
进行更改。但是,除非遇到特定问题,否则我建议不要更改任何默认值。
答案 1 :(得分:6)
elixir VM就是Erlang VM,它可以调度如何将生成的进程分配给机器CPU。你没有直接控制AFAIK。但是,您可以通过在运行自己的代码之前发出top
来使用图表的可视化来查看VM中如何占用4个调度程序。我发现它似乎做得非常合理。对于现实检查,您还可以在Linux OS上运行$i
。这可以显示实际使用的每个cpu的数量 - 尝试从同一台机器上的不同控制台按顶部1。