目前我正在研究Erlang的过程模型。我在Erlang的技术报告 (第3节第2段)中遇到了一个障碍:
这解释了为什么在某些情况下使用一个调度程序来运行、多个SMP,而不是在一个带有多个调度器的上运行SMP的原因。当然,几个VM的运行要求应用程序可以在许多并行任务中运行,这些任务彼此之间没有或很少的通信。
现在,这一段让我感到困惑;我可以看到单一进程多调度器的场景,但我没有看到单个调度程序的多个进程;据推测,每个进程都有一个不同的节点名,这意味着某个应用程序未经修改就不能与此模型一起使用;不需要修改的优点在报告中被提到为SMP的一个关键特性。如果多个进程有相同的节点名称,那么性能将是灾难性的,原因是Erlang进程间的消息传递风暴--这假设使用内存中的遗忘。是否有一些没有在本文中介绍的过程模型,而我在这里遗漏了它?
作者在这里试着说什么?他是否试图建议,对于多进程单调度程序的情况,必须重写应用程序(考虑到多个唯一的节点名称)?
-编辑1:问题来源的澄清
这个问题已经通过讨论得到了回答,下面是我遇到的麻烦的概要。
这个问题的问题是,正如我记得的那样,文档没有涉及每台物理机器运行多个Erlang仿真器的场景--一直被证明模拟器代表了您的物理机器(在工业使用中);而且,为了提高计算效率而不得不显式划分一个程序的场景从未被考虑过。这一突如其来的介绍是我不幸的根源。
该约定仍然倾向于创建许多进程,而且未来将对Erlang的SMP仿真器进行许多改进,这意味着假设有利的应用程序设计,每个机器的单个节点仍然是一个非常可行的选项。
发布于 2009-12-07 20:31:08
读完文章后重写:
这解释了为什么在某些情况下使用一个调度程序来运行多个SMP,而不是在一个带有多个调度器的SMP VM上运行更高效。
当然,几个VM的运行要求应用程序可以在许多并行任务中运行,这些任务彼此之间没有或很少的通信。
发布于 2009-12-07 21:15:54
如果在一个VM中有多个调度器,它们将不可避免地争夺各种资源(例如,ets元表、原子表、迁移期间的调度器运行队列等)。因为内在的建筑。如果您有一个调度程序,显然不会发生争用。锁检查和获取仍将进行,因此运行非SMP VM将产生更好的性能(但需要从源重新构建VM )。
以四核机器为例。选项一意味着运行Erlang的四个实例,每个实例都有一个调度程序,关联设置为不同的处理器核。选项二意味着运行一个具有四个调度程序的单个Erlang,每个调度器的关联集设置为不同的处理器核。
如果您有大量独立的进程要运行,选项二将导致更好的性能,因为这四个核心将得到充分利用(理论上)。相反,在选项一中,这是不可能的,因为锁争用会使内核上的执行不时地等待。
另一方面,如果您的进程需要频繁地聊天,选择一种方式是可行的,因为进程间通信比不同VM之间的通信便宜得多。这样做比在锁争用中损失更多。
发布于 2009-12-07 20:30:15
我相信答案在上一段:
只有一个调度程序的SMP VM比非SMP VM稍慢(10%)。这是因为SMP VM需要对所有共享数据结构使用锁。但是,只要没有锁冲突,锁造成的开销就不会那么高(锁冲突需要时间)。
调度程序对共享数据结构的锁的依赖可能会给给定的系统带来开销。因此,在一个SMP VM上拥有多个调度程序会带来更大的总体开销。
https://stackoverflow.com/questions/1862655
复制相似问题