我如何获得我的erlang vm托管的cpu_id?

时间:2013-08-15 08:21:29

标签: erlang

我有一个问题。

我如何知道当前Erlang VM所在的核心(CPU)?

现在我只能通过os:get_pid获取当前BEAM流程的 pid 。我可以在erlang代码中运行shell命令来获取core_id,但它并不优雅。

像:
Cmd = "ps -eo pid,psr,pcpu,pmem | egrep '^\\s*" ++ beam_pid() ++ "\\b'",
Res = os:cmd(Cmd).

是否提供了任何Erlang API?

任何人都可以帮助我吗?

谢谢

2 个答案:

答案 0 :(得分:2)

从对johlo的回答的评论来看,你在没有SMP和taskset的Linux上运行Erlang。

用于处理CPU绑定和关联的多平台代码位于erl_misc_utils.c。 Erlang目前支持在较新的Linux,Windows,Solaris(以及带有kstat的派生操作系统)和FreeBSD上绑定调度程序线程。这就是erlang:system_info(cpu_topology)在MacOS X上返回undefined的原因。但是,它可以在您的Linux发行版中使用,如评论中所述。

在Linux上,taskset设置子进程的CPU亲和性。然而,Erlang直接从/sys/devices/system获取CPU,这忽略了当前的亲和力。所以使用taskset,你是在愚弄Erlang ,在SMP模式下,它可能会尝试绑定调度程序而没有成功。

此外,似乎了解与taskset强制CPU亲和关系的唯一方法是获得CPU亲和性。哪个 Erlang VM似乎没有通过任何API公开。似乎函数erts_get_available_cpu查询操作系统的CPU亲和性是not even called

我可以看到针对您的具体问题的两种解决方案:

第二种解决方案当然更清洁,更便携,但如上所述,它不适用于某些平台。请注意,此可能要求在SMP模式下运行Erlang,但使用单个逻辑处理器的正确用户定义拓扑将使Erlang启动单个调度程序。您也可以传递便携式的+S 1:1

答案 1 :(得分:0)

您可以尝试erlang:system_info(cpu_topology).,它会返回有关使用哪些处理器/核心的信息。请参阅documentation

注意:在Mac OS X上,这似乎不起作用,它只是为我返回undefined