gpt4 book ai didi

multithreading - Erlang在运行并发任务时没有使用所有CPU核心,为什么?

转载 作者:行者123 更新时间:2023-12-04 04:27:16 30 4
gpt4 key购买 nike

目前,我正在阅读一本“Programming Erlang”书,我决定在创建 N 个进程的基准测试中测试我的系统,代码如下:

-module(my_ring).
-export([start/1, start_proc/2]).

start(Num) ->
start_proc(Num, self()).

start_proc(0, Pid) ->
Pid ! ok;
start_proc(Num, Pid) ->
NPid = spawn(?MODULE, start_proc, [Num - 1, Pid]),
NPid ! ok,
receive
ok ->
ok
end.

我在 Windows 7 x64 上安装了 Intel i5,在创建 100 000 000 个进程时,我检查了 CPU 的负载。事实证明,只有一个核心满负荷工作,其他核心什么也不做(因此系统总体负载为 25%)。我认为 Erlang VM 会平衡所有 4 个可用核心的负载,但事实并非如此。

有人知道为什么吗?我的 Erlang VM 配置有什么问题吗?

最佳答案

我认为限制此示例并行性的一件事是实际上很少有并行工作正在完成。每个进程都会生成链中的下一个进程,并立即向其发送一条 ok 消息。这意味着下一个进程在生成其下一个进程后将收到ok并终止。所以,事实上,实际上不会有很多进程同时运行。

可以看到这一点的一种方法是,您正在启动 100M 进程,而默认系统仅允许同时运行约 34k 个进程。

更好的测试是启动一个环形进程,其中每个进程生成下一个进程并进入循环,在循环中接收消息并将其发送到下一个进程。然后整个环就会同时运行。为了获得正确的并行事件,环的头部必须在开始从环中接收消息之前在环周围发送大量消息。如果您在环路中一次发送一条消息,那么一次仍然只有一个进程在工作。

拥有大量进程并不能保证应用程序的并行性,请参阅 Amdahl's law获取问题的描述。

关于multithreading - Erlang在运行并发任务时没有使用所有CPU核心,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5696763/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com