Erlang文档/SMP:每台机器或每个应用程序的单节点和多节点,以及可能出现的混淆

Erlang文档/SMP:每台机器或每个应用程序的单节点和多节点,以及可能出现的混淆,erlang,ipc,scheduled-tasks,smp,Erlang,Ipc,Scheduled Tasks,Smp,我现在正在研究Erlang的过程模型。我在关于Erlang的a(第3节第2段)中遇到了一个障碍: 这解释了为什么在某些情况下运行多个SMP虚拟机会更有效 在一个SMP虚拟机上使用一个调度程序,而在一个SMP虚拟机上使用多个调度程序。当然 多个VM的运行要求应用程序可以在多个并行任务中运行 彼此之间没有或很少沟通 现在这一段让我困惑;我可以看到单进程多调度程序场景,但我无法看到具有单个调度程序的多个进程;假设每个进程都有一个不同的节点名,这意味着某个应用程序在没有修改的情况下不能与该模型一起使用报

我现在正在研究Erlang的过程模型。我在关于Erlang的a(第3节第2段)中遇到了一个障碍:

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

现在这一段让我困惑;我可以看到单进程多调度程序场景,但我无法看到具有单个调度程序的多个进程;假设每个进程都有一个不同的节点名,这意味着某个应用程序在没有修改的情况下不能与该模型一起使用报告中提到了无需修改的优点如果多个进程具有相同的节点名,那么由于Erlang进程间消息风暴,性能将是灾难性的——这假设使用内存遗忘症。是否有一些流程模型没有在本文中介绍,而我在这里没有介绍

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

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

这个问题已经通过讨论得到了回答;下面是我遇到的麻烦的概要

这个问题的问题是,正如我所记得的,文档中没有涉及每个物理机器运行多个Erlang仿真器的场景——它总是显示仿真器代表您的物理机器(在工业使用中);此外,还从未考虑过为了计算效率而必须显式划分程序的场景。这种突然的介绍一直是我苦恼的根源


该约定仍然倾向于创建大量进程,并且未来会对用于Erlang的SMP emulator进行许多改进,这意味着假设应用程序设计良好,每台机器的单个节点仍然是一个非常可行的选择。

我相信答案在前一段:

只有一个调度器的SMP VM比没有调度器的SMP VM稍慢(10%) SMP虚拟机。 这是因为SMP虚拟机需要对所有共享资源使用锁 数据结构。但作为 只要不存在锁冲突,就会减少由 锁定没有那么高(它 是需要时间的锁冲突)


调度器对共享数据结构锁的依赖可能会给给定系统带来开销。因此,在一个SMP虚拟机上使用多个调度程序会带来更大的总体开销。

请在阅读文章后重写:

这就解释了为什么在某些情况下它可以 更高效地运行多个SMP 每个虚拟机都有一个调度程序 在一个具有多个调度程序的SMP VM上

  • 非SMP虚拟机没有锁,因此运行速度很快
  • 由于检查锁的成本,单调度器SMP VM速度降低10%
  • 由于使用/等待锁,多计划程序SMP VM再次变慢
当然,运行几个虚拟机 要求应用程序可以运行 在许多并行任务中,没有或 彼此之间很少沟通 其他的

  • 我认为:同一服务器上的节点必须有不同的名称
  • 进程间消息传递,而由于VM节点的进程间消息传递的性质,速度较慢

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

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

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


另一方面,如果您的进程需要频繁地喋喋不休,那么选择一是可行的,因为进程间通信比不同VM之间的通信要便宜得多。通过锁争用,您可以获得比丢失更多的好处。

在一台物理机器上有一些带有多个节点的advatanges

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

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

3) 内存位置。少数节点提供了一种糟糕的mans方法,可以将进程强制到少数核心。这对NUMA ARCH来说可能是一个巨大的提升,但对SMP来说也是如此。调度程序还没有考虑NUMA。您可以将进程生成到特定的调度程序并将其锁定,它不会迁移,但这是一个未记录的功能。。。或者它被一起移除了。我忘了

对于多个节点,当然在节点之间需要一个负载平衡器,但这是通常的方法。一些管理节点的逻辑

然而 spawn_opt(fun() -> ... end, [{scheduler, Id}]) -> pid(), where Id is an integer and refers to a specific scheduler.