生成新进程是否使用elixir中的所有CPU核
假设我在一台4核CPU机器上 如果我在elixir VM中运行以下操作:生成新进程是否使用elixir中的所有CPU核,elixir,Elixir,假设我在一台4核CPU机器上 如果我在elixir VM中运行以下操作: 1..4 |> Enum.map fn(x) -> spawn(computationally_heavy_process) end 这是否使用了我机器的全部4个内核。每个计算繁重的进程中都有一个?elixir虚拟机就是Erlang虚拟机,它调度生成的进程如何分配给机器CPU。你没有直接的控制权。但是,在运行自己的代码之前,通过发出:observer.start(),您可以使用图表的可视化来查看4个调度程序
1..4 |> Enum.map fn(x) -> spawn(computationally_heavy_process) end
这是否使用了我机器的全部4个内核。每个计算繁重的进程中都有一个?elixir虚拟机就是Erlang虚拟机,它调度生成的进程如何分配给机器CPU。你没有直接的控制权。但是,在运行自己的代码之前,通过发出
:observer.start()
,您可以使用图表的可视化来查看4个调度程序在VM中的使用情况。我发现它似乎做得很合理。为了进行真实性检查,您还可以在linux操作系统上运行top
。这可以显示每个cpu的实际使用量-尝试在同一台机器上的不同控制台上按1 是的。默认情况下,Erlang为每个CPU启动一个调度程序(OS线程),并尝试在调度程序之间均匀分配负载。但是,不能保证这四个进程最终会在四个不同的CPU中处理,因为通常会有更多的事情并行发生。如果您想知道Erlang已经启动了多少个调度程序,只需启动iex
(或者erl
)
例如,我的电脑有一个8核的CPU。在输出的第一行中,您可以看到当前配置。从部分[smp:8:8]
中,您可以看到它配置了8个调度程序,其中8个是在线的。可以使用覆盖调度程序/线程的数量
+S调度器:SchedulerOnline
设置要创建的计划程序线程数和计划程序线程数
在启用SMP支持时设置为联机。两者的最大值
值为1024。如果Erlang运行时系统能够确定
配置的逻辑处理器数量和逻辑处理器数量
可用,调度程序将默认为配置的逻辑处理器,
SchedulerOnline将默认为可用的逻辑处理器;
否则,默认值将为1。[……]
在线调度程序的数量也可以在运行时通过更改。但是,我建议不要更改任何默认设置,除非您遇到特定问题。Erlang和OTP在第一章中非常好地介绍了这方面的基础知识。编辑了我的答案,以提供有关如何内省当前计划程序配置的更多详细信息,以及指向Erlang文档的链接。
~$ iex
Erlang/OTP 17 [erts-6.4] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
...