产生新进程是否使用elixir中的所有CPU核心

时间:2015-05-26 02:41:51

标签: elixir

假设我正在使用4核CPU机器。

如果我在我的elixir VM中运行以下命令:

 1..4 |> Enum.map fn(x) -> spawn(computationally_heavy_process) end

这是否使用我机器的所有4个核心。每个计算繁重的过程之一?

2 个答案:

答案 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。