【问题标题】:Erlang not using all cores of cpu when running concurrent tasks, why?Erlang 在运行并发任务时没有使用所有 CPU 内核,为什么?
【发布时间】:2011-08-07 11:51:39
【问题描述】:

目前,我正在阅读“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 的配置有什么问题吗?

【问题讨论】:

    标签: multithreading concurrency erlang


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我认为它不会在接收时终止进程,因为没有指定超时,它只会产生所有这些进程并且它们都会等待消息,还是我错了?
    • @Troydm 他们将终止。每个进程运行函数start_proc/2,它产生下一个进程,立即向它发送一个ok,然后等待它收到一个ok,然后终止。它将很快收到ok,因为生成它的进程会立即发送它。因此,并行运行的进程将非常少,因为它们都很快终止。
    • 感谢您的回答,在 Erlang 中掌握并发性仍然相当困难,但我会尝试 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 2016-09-10
    • 2017-04-10
    • 2014-01-15
    • 1970-01-01
    相关资源
    最近更新 更多