使用Linux获取Erlang中的内核数

使用Linux获取Erlang中的内核数,erlang,Erlang,我正在编写一个并发程序,我需要知道系统的内核数,这样程序才能知道要打开多少进程。 是否有命令在Erlang代码中获取此信息 Thnx.这些信息是如何公开的将是非常特定于操作系统的(当然,除非您碰巧是) 你没说你在用什么操作系统。在Linux的情况下,您可以从/proc/cpuinfo获取数据,但是超读的含义和使用共享二级缓存在同一个芯片上的多个内核的问题有一些微妙之处(实际上您有一个NUMA体系结构)。您可以使用 erlang:system_info(logical_processors_ava

我正在编写一个并发程序,我需要知道系统的内核数,这样程序才能知道要打开多少进程。 是否有命令在Erlang代码中获取此信息


Thnx.

这些信息是如何公开的将是非常特定于操作系统的(当然,除非您碰巧是)

你没说你在用什么操作系统。在Linux的情况下,您可以从/proc/cpuinfo获取数据,但是超读的含义和使用共享二级缓存在同一个芯片上的多个内核的问题有一些微妙之处(实际上您有一个NUMA体系结构)。

您可以使用

erlang:system_info(logical_processors_available)
要获取erlang运行时系统可以使用的内核数,还有:

erlang:system_info(schedulers_online)

它告诉您实际运行的调度程序线程数。

要获取可用内核数,请使用该标志:

这个有两个伴随标志:显示有多少正在使用,以及有多少可用(当所有可用的逻辑处理器联机时,它将返回
unknown

要知道如何并行化您的代码,您应该依赖于返回当前VM实例中可用的实际Erlang调度程序数量的参数:

1> erlang:system_info(schedulers_online).
8

但是请注意,仅对该值进行并行化可能是不够的。有时您运行的其他进程需要一些CPU时间,有时您的算法将受益于更多的并行性(例如等待IO)。经验法则是使用从
schedulers\u online
获得的值作为并行性的乘数,但始终使用不同的倍数进行测试,以查看什么最适合您的应用程序。

我使用的是Linux操作系统,当erlang在shell中启动时,有smp 4:4,所以我猜VM知道内核的数量,所以我如何获得此信息?这似乎是一个更好的方法,因为它尊重
erl
的+S选项。这为我返回了
未知的
(英特尔Core 2 Duo MacBook Pro 2009年年中,带OS X 10.9.4)我是唯一一个不明白为什么需要将进程数限制在内核数以内的人吗?Erlang有一个抢占式调度程序,因此,即使在双核机器上有100000个进程,它们或多或少都会获得同等的CPU时间份额。
1> erlang:system_info(schedulers_online).
8