Erlang 中的进程平衡
Posted
技术标签:
【中文标题】Erlang 中的进程平衡【英文标题】:Process balancing in Erlang 【发布时间】:2010-10-05 09:53:10 【问题描述】:有人知道 erlang 标准库中是否有某种“负载平衡器”吗?我的意思是,如果我对一组非常大的数据进行一些非常简单的操作,那么为每个项目构建一个流程的开销将大于按顺序执行操作。但是如果我能在“正确数量”的过程中平衡工作,它会表现得更好,所以我基本上是在问是否有一种简单的方法来完成这项任务。
顺便问一下,有人知道 OTP 应用程序是否会进行某种负载平衡吗?我的意思是,在 OTP 应用程序中存在“工作进程”的概念(如 java-ish 线程工作人员)?
【问题讨论】:
【参考方案1】:请参阅模块 pg2
和 pool
。
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 中的进程平衡的主要内容,如果未能解决你的问题,请参考以下文章