Erlang 中的进程平衡

Posted

技术标签:

【中文标题】Erlang 中的进程平衡【英文标题】:Process balancing in Erlang 【发布时间】:2010-10-05 09:53:10 【问题描述】:

有人知道 erlang 标准库中是否有某种“负载平衡器”吗?我的意思是,如果我对一组非常大的数据进行一些非常简单的操作,那么为每个项目构建一个流程的开销将大于按顺序执行操作。但是如果我能在“正确数量”的过程中平衡工作,它会表现得更好,所以我基本上是在问是否有一种简单的方法来完成这项任务。

顺便问一下,有人知道 OTP 应用程序是否会进行某种负载平衡吗?我的意思是,在 OTP 应用程序中存在“工作进程”的概念(如 java-ish 线程工作人员)?

【问题讨论】:

【参考方案1】:

请参阅模块 pg2pool

pg2 实现了相当简单的分布式进程池。 pg2:get_closest_pid/1 返回“最近的”pid,即随机本地进程(如果可用),否则为随机远程进程。

pool实现以模块slave开始的节点之间的负载均衡。

【讨论】:

【参考方案2】:

plists 模块可能会满足您的需求。它基本上是lists 模块的并行实现,旨在用作替代品。但是,您也可以控制它如何并行化其操作,例如通过定义应生成多少工作进程等。

您可能会根据列表的长度或系统的负载等计算一些工人数。

来自网站:

plists 是 Erlang 模块列表,使大多数 列出并行操作。它可以 并行操作每个元素, 对于 IO 绑定操作,在子列表上 同时,为了利用 受 CPU 限制的多核机器 操作,以及跨 erlang 节点, 用于在集群内并行化。它 处理错误和节点故障。它 可以配置、调整和调整 在获得最佳性能的同时 最小化开销。

【讨论】:

【参考方案3】:

在我看来,otp 中没有有用的通用负载平衡工具。也许只有在特定情况下才有用。自己实现一个很容易。 plists 在相同的情况下可能很有用。我不相信并行库可以替代真实的东西。如果您走这条路,Amdahl 将永远困扰您。

正确的工作进程数量等于调度程序的数量。这可能会有所不同,具体取决于系统上执行的其他工作。使用,

erlang:system_info(schedulers_online) -> NS

获取调度器的数量。

用大量工作进程淹没系统时的开销概念有些错误。新进程有开销,但没有 os-threads 那么多。主要开销是进程之间的消息复制,这可以通过使用二进制文件来缓解,因为只发送对二进制文件的引用。使用 eterms,首先扩展结构,然后复制到其他进程。

【讨论】:

【参考方案4】:

如果不进行测量,就无法机械地预测工作成本,例如做它。有些人必须确定如何为某类任务分配工作。在负载平衡器一词中,我理解的内容与您的问题非常不同。

【讨论】:

以上是关于Erlang 中的进程平衡的主要内容,如果未能解决你的问题,请参考以下文章

基于 Erlang 的聊天(负载平衡和通知分发)

从技术上讲,为啥 Erlang 中的进程比 OS 线程更高效?

Erlang 语言中的进程与并发

Erlang 作为后端进程

进程中的 Erlang 错误,退出值为 undef

Erlang中的空进程邮箱