0

我有个问题。

我如何知道当前 Erlang VM 托管在哪个内核 (CPU) 上?

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

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

是否提供了任何 Erlang API?

任何人都可以帮助我吗?

谢谢

4

2 回答 2

2

从对 johlo 的回答的评论来看,您在没有 SMP 和taskset.

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

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

此外,似乎了解强制 CPU 亲和性的唯一方法taskset是获取 CPU 亲和性。Erlang VM 似乎没有通过任何 API 公开。似乎甚至没有调用erts_get_available_cpu向操作系统查询 CPU 亲和性的函数。

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

  • 由于您使用的是taskset,您可以在命令行上传递一些信息(例如配置值),以告诉您的应用程序在哪个 CPU 上运行;
  • 或者,您可以使用 Erlang 绑定调度程序的能力来代替taskset,并为您的 VM 提供单核的部分 CPU 拓扑。这个技巧实际上在+sct option 的文档中有所描述。然后,使用erlang:system_info(cpu_topology)orerlang:system_info(scheduler_bindings)会告诉你 Erlang 当前在哪个处理器上运行。

第二种解决方案当然更干净、更便携,尽管它不适用于上面提到的某些平台。请注意,这可能需要在 SMP 模式下运行 Erlang,但是具有单个逻辑处理器的正确用户定义拓扑将使 Erlang 启动单个调度程序。你也可以通过+S 1:1是可移植的。

于 2013-08-15T22:37:43.307 回答
0

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

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

于 2013-08-15T08:56:55.850 回答