我正在编写一个并发程序,我需要知道系统的核心数量,这样程序就会知道要打开多少个进程。是否有命令可以在 Erlang 代码中获取此信息?
谢谢。
您可以使用
erlang:system_info(logical_processors_available)
获取 erlang 运行时系统可以使用的内核数。
还有:
erlang:system_info(schedulers_online)
它告诉您实际运行了多少调度程序线程。
要获取可用内核的数量,请使用以下logical_processors
标志erlang:system_info/1
:
1> erlang:system_info(logical_processors).
8
这个有两个伴随标志:logical_processors_online
显示有多少正在使用,并logical_processors_available
显示有多少可用(unknown
当所有可用的逻辑处理器都在线时,它将返回)。
要知道如何并行化您的代码,您应该依赖schedulers_online
which 将返回当前 VM 实例中可用的实际 Erlang 调度程序的数量:
1> erlang:system_info(schedulers_online).
8
但是请注意,仅对这个值进行并行化可能还不够。有时您运行的其他进程需要一些 CPU 时间,有时您的算法将受益于更多的并行性(例如等待 IO)。经验法则是使用从获得的值schedulers_online
作为并行度的乘数,但始终使用不同的乘数进行测试,以查看最适合您的应用程序的值。
如何公开这些信息将是非常特定于操作系统的(当然,除非您碰巧正在编写操作系统)。
你没有说你正在使用什么操作系统。在 Linux 的情况下,您可以从 /proc/cpuinfo 获取数据,但是在超线程的含义和使用共享 L2 缓存的同一裸片上的多个内核问题上存在一些微妙之处(实际上,您有一个 NUMA 架构)。