3

我现在正在研究 Erlang 的流程模型。我在有关 Erlang的技术报告(第 3 节第 2 段)中遇到了问题:

这解释了为什么在某些情况下运行多个 SMP VM 和一个调度程序而不是在一个 SMP VM 上运行多个调度程序会更有效。当然,多个虚拟机的运行要求应用程序可以运行在许多并行任务中,这些任务彼此之间没有或只有很少的通信。

现在这一段让我感到困惑;我可以看到单进程多调度程序场景,但我没有看到单个调度程序的多个进程;大概每个进程都有一个不同的节点名称,这意味着某个应用程序未经修改就不能与该模型一起使用;报告中提到了不需要修改的优点,这是 SMP 的一个关键特征。如果多个进程具有相同的节点名称,那么由于 Erlang 进程间消息传递风暴,性能将是灾难性的——假设使用内存中的 amnesia。是否有一些本文没有介绍的流程模型,而我在这里遗漏了这些模型?

作者想在这里说什么?他是否试图建议必须为多进程单调度程序案例重写应用程序(以考虑多个唯一节点名称)?

-- 编辑 1:澄清问题的根源 --

该问题已通过讨论得到解答;以下是我遇到的麻烦的概述。

这个问题的问题是,我记得,文档没有涉及在每台物理机器上运行多个 Erlang 模拟器的场景——它一直显示模拟器代表你的物理机器(在工业用途中);此外,从未考虑过必须显式划分程序以提高计算效率的情况。这种突然的介绍是我痛苦的根源。

该约定仍然偏向于创建大量进程,并且未来将为 Erlang 的 SMP 仿真器进行许多改进,这意味着假设有利的应用程序设计,每台机器单个节点仍然是一个非常可行的选择。

4

4 回答 4

5

阅读文章后重写:

这解释了为什么在某些情况下,运行多个 SMP VM 和一个调度程序会更有效,而不是在一个 SMP VM 上运行多个调度程序。

  • 非 SMP VM 没有锁,因此运行速度很快。
  • 由于检查锁的成本,单调度程序 SMP VM 慢 10%
  • 由于使用/等待锁,多个调度程序 SMP VM 再次变慢

当然,多个虚拟机的运行要求应用程序可以运行在许多并行任务中,这些任务彼此之间没有或只有很少的通信。

  • 我认为:同一服务器上的节点必须具有不同的名称。
  • 由于VM节点的进程间性质与进程内消息传递相比,进程间消息传递速度较慢。
于 2009-12-07T20:31:08.080 回答
2

如果您在单个 VM 中有多个调度程序,由于内部架构,它们将不可避免地争用各种资源(例如 ets 元表、原子表、迁移期间的调度程序运行队列等)。如果你只有一个调度器,显然不会发生争用。锁定检查和获取仍然会进行,因此运行非 SMP VM 会产生更好的性能(但需要从源代码重建 VM)。

以四核机为例。选项一意味着您运行四个 Erlang VM 实例,每个实例都有一个调度程序,关联设置为不同的处理器内核。选项二意味着运行一个带有四个调度器的 Erlang VM,每个调度器的关联设置为不同的处理器内核。

如果你有很多独立的进程要运行,选项二会带来更好的性能,因为四个核心将被充分利用(理论上)。相反,在选项一中,这是不可能的,因为锁争用会使内核上的执行不时地相互等待。

另一方面,如果您的进程需要经常聊天,则选项一是可行的方法,因为进程间通信比不同 VM 之间的通信便宜得多。与锁定争用相比,您获得的收益比失去的多。

于 2009-12-07T21:15:54.150 回答
1

我相信答案在前一段:

只有一个调度程序的 SMP VM 比非 SMP VM 稍慢 (10%)。这是因为 SMP VM 需要对所有共享数据结构使用锁。但是只要没有锁冲突,锁造成的开销就不会那么高(需要时间的是锁冲突)。

调度程序对共享数据结构的锁的依赖会给给定系统带来开销。在一个 SMP VM 上拥有多个调度程序似乎会带来更大的开销。

于 2009-12-07T20:30:15.677 回答
1

在一台物理机器上有多个节点有一些优点。

1) 如上所述的资源锁定开销。

2) 故障转移。在电信产品中,您真的不想让光束撞到您身上。如果您的系统中有 NIF 或链接的驱动程序,则可能会发生这种情况。

3) 内存局部性。很少有节点为您提供了一种将进程强制到几个核心的穷人方式。这对于 NUMA 架构和 SMP 来说都是一个巨大的推动力。调度程序(还)不考虑 NUMA。您可以将进程生成到特定的调度程序并将其锁定,它不会迁移,但这是一个未记录的功能......或者它被一起删除了。我忘了。

对于多个节点,您当然需要节点之间的负载均衡器,但无论如何这是通常的方法。一些监督节点的逻辑。

但是,EUC 论文中的数字已有一年多的历史 [@],如果您真的不需要它,我不会推荐多节点方法。如今,运行时系统在处理这些类型的问题方面要好得多。大量的锁开销已被移除,并且 mrq-scheduler 已得到改进。

@ 2009 的数字看起来像这样

编辑:

关于 3) 我提到的 spawn 功能是,

spawn_opt(fun() -> ... end, [{scheduler, Id}]) -> pid(),
    其中 Id 是一个整数,指的是一个特定的调度程序。

我不建议使用它,因为它没有记录。

于 2009-12-08T21:16:34.813 回答