我正在编写一个并发程序,我需要知道系统的内核数量,这样程序才能知道要打开多少个进程。在Erlang代码中是否有这样的命令?
Thnx。
您可以使用
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
,它将返回当前VM实例中可用的实际Erlang调度器的数量:
1> erlang:system_info(schedulers_online).
8
但是请注意,仅对该值进行并行处理可能是不够的。有时你有其他进程在运行,需要一些CPU时间,有时你的算法会从更多的并行性中受益(例如,等待IO)。经验法则是使用从schedulers_online
获得的值作为并行度的倍数,但始终使用不同的倍数进行测试,以查看什么最适合您的应用程序。
如何公开这些信息将是非常特定于操作系统的(当然,除非您碰巧正在编写操作系统)。
你没有说明你在使用什么操作系统。在Linux的情况下,你可以从/proc/cpuinfo获取数据,但超线程的含义和使用共享二级缓存在同一个芯片上多个内核的问题有一些微妙之处(实际上你有一个NUMA体系结构)。