我如何知道当前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?
任何人都可以帮助我吗?
谢谢
阮
答案 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。
我可以看到针对您的具体问题的两种解决方案:
taskset
,所以您可以在命令行上传递一些信息(例如配置值),告诉您的应用他们正在运行哪个CPU; taskset
您的VM具有单核的部分CPU拓扑。这个技巧实际上在documentation of +sct option中描述。然后,使用erlang:system_info(cpu_topology)
或erlang:system_info(scheduler_bindings)
将告诉您当前正在运行Erlang的处理器。第二种解决方案当然更清洁,更便携,但如上所述,它不适用于某些平台。请注意,此可能要求在SMP模式下运行Erlang,但使用单个逻辑处理器的正确用户定义拓扑将使Erlang启动单个调度程序。您也可以传递便携式的+S 1:1。
答案 1 :(得分:0)
您可以尝试erlang:system_info(cpu_topology).
,它会返回有关使用哪些处理器/核心的信息。请参阅documentation。
注意:在Mac OS X上,这似乎不起作用,它只是为我返回undefined
。