假设,我在一台4核CPU机器上.
如果我在我的elixir VM中运行以下命令:
1..4 |> Enum.map fn(x) -> spawn(computationally_heavy_process) end
Run Code Online (Sandbox Code Playgroud)
这是否使用我机器的所有4个核心.每个计算繁重的过程之一?
Pat*_*ity 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]
...
Run Code Online (Sandbox Code Playgroud)
例如,我的计算机有一个8核的CPU.在输出的第一行,您可以看到当前配置.从该部分[smp:8:8],您可以看到SMP配置了8个调度程序,其中8个在线.调度器/线程的数量可以与被覆盖的+S标志.
+ S Scheduler:SchedulerOnline
设置要创建的调度程序线程数,以及在启用SMP支持时在线设置的调度程序线程.两个值的最大值为1024.如果Erlang运行时系统能够确定配置的逻辑处理器数量和逻辑处理器可用,则Scheduler将默认配置为逻辑处理器,而SchedulersOnline将默认为逻辑处理器可用; 否则,默认值为1. [...]
在线调度程序的数量也可以在运行时通过更改:erlang.system_flag(:schedulers_online, n).但是,除非遇到特定问题,否则我建议不要更改任何默认值.
elixir VM就是Erlang VM,它可以调度如何将生成的进程分配给机器CPU.你没有直接控制AFAIK.但是,您可以:observer.start()在运行自己的代码之前通过发布使用图表的可视化来查看VM中如何占用4个调度程序.我发现它似乎做得非常合理.对于现实检查,您也可以top在Linux OS上运行.这可以显示实际使用的每个cpu的数量 - 尝试从同一台机器上的不同控制台按顶部1.