4

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

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

4

4 回答 4

13

请参阅模块pg2pool.

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

pool实现以 module 开头的节点之间的负载平衡slave

于 2009-02-04T14:06:59.183 回答
3

plists模块可能会执行您想要的操作。它基本上是lists模块的并行实现,设计用作替代品。但是,您还可以控制它如何并行化其操作,例如通过定义应该产生多少工作进程等。

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

从网站:

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

于 2009-02-05T14:02:51.060 回答
1

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

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

erlang:system_info(schedulers_online) -> NS

获取调度程序的数量。

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

于 2009-05-01T21:39:48.960 回答
0

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

于 2009-02-04T14:16:16.107 回答