@Thiago Silveira 关于 iex 输出的第一行的精彩评论。该部分[smp:8:8]
说明 Erlang 使用了多少操作系统级进程。--smp
如果你想禁用它,你可以用 flag来控制它:
iex --erl '-smp disable'
这将确保您只有一个系统进程。您可以通过启用对称多处理来实现类似的结果,但直接设置NumberOfShcedulers:NumberOfSchedulersOnline
.
iex --erl '+S 1:1'
每个操作系统进程都需要有自己的 Erlang 进程调度程序,因此您可以轻松查看当前有多少个进程:
:erlang.system_info(:schedulers_online)
回答您关于性能的问题。如果您的处理器没有满负荷工作(100%)并且没有一个处理器什么都不做(0%),那么使负载分布更均匀很可能不会加快速度。为什么?
CPU 使用率是通过在多个时间点探测处理器状态来测量的。这种状态要么是“工作”,要么是“空闲”。82% 的 CPU 使用率意味着您可以在此 CPU 上执行更多任务,而不会减慢其他任务的速度。
Erlang 调度器尽量聪明,不会在内核之间迁移 Erlang 进程,除非因为它需要复制而必须这样做。例如,当调度程序之一空闲时,就会发生迁移。然后它可以从其他调度程序运行队列中借用一个进程。
下一个可能导致奇数核和偶数核之间存在如此大差异的是超线程。在我的双核处理器htop
上显示 4 个逻辑核心。在您的情况下,由于 HT,您可能有 4 个物理内核和 8 个逻辑内核。您可能会 100% 使用物理内核。
另一件事:pmap 需要在单独的进程中计算结果,但最后它会将结果发送给调用者,这可能是一个瓶颈。您发送的消息越多,您可以实现的 CPU 利用率就越低。您可以尝试为进程分配一个真正占用大量 CPU 的任务,例如计算Ackerman 函数。您甚至可以使用阿姆达尔定律和测量不同内核数量的执行时间来计算您的工作有多少是顺序部分,多少是并行的。
总结一下:截图中的CPU利用率看起来真的很棒!您无需为更多性能密集型任务进行任何更改。