2009-02-04 50 views
4

有沒有人知道erlang標準庫中是否有一種「負載平衡器」?我的意思是,如果我對一組非常大的數據有一些非常簡單的操作,那麼爲每個項目構建一個進程的開銷將大於順序執行操作。但是如果我可以在「正確數量」的流程中平衡工作,它會表現得更好,所以我基本上是問是否有簡單的方法來完成這項任務。Erlang中的流程平衡

順便說一句,有沒有人知道一個OTP應用程序是否做某種平衡負載?我的意思是,在一個OTP應用程序中有一個「工作進程」的概念(如java-ish線程工作者)?

回答

3

plists模塊可能做你想做的。它基本上是lists模塊的一個並行實現,設計用作插入式替換。但是,您也可以控制其操作的並行化方式,例如通過定義應生成多少工作進程等。

您可能會通過計算一些取決於列表或負載長度的工作數系統等

從網站:

的Plist是一個下拉更換爲 Erlang的模塊列表,使得最 列表操作並行。它可以 並聯的每個元素, 爲IO綁定操作上操作,在平行的子列表 ,用於與CPU結合的 操作服用 多核機器的優點,以及跨Erlang節點, 爲集羣內parallizing 。它 處理錯誤和節點故障。它可以配置,調整和調整 以獲得最佳性能,而 可以最小化開銷。

13

請參閱模塊pg2pool

pg2實現相當簡單的分佈式進程池。 pg2:get_closest_pid/1返回「最接近」pid,即隨機本地過程(如果可用),否則是隨機遠程過程。

pool實現從模塊slave開始的節點之間的負載平衡。

0

沒有辦法如何預測工作成本而沒有測量它是沒有辦法的。有些人必須確定如何爲某些類別的任務分配工作。在負載均衡器中,我理解與你的問題非常不同的東西。

1

在我看來,在otp中沒有有用的通用負載均衡工具。也許只有在特定情況下才有用。自己實現一個很容易。在相同的情況下,plists可能會有用。我不相信並行庫作爲真實事物的替代品。如果你走這條路,Amdahl會永遠纏着你。

工作進程的正確數量等於調度程序的數量。這可能取決於系統上完成的其他工作。使用,

erlang:system_info(schedulers_online) -> NS 

獲取調度程序的數量。

使用大量工作進程淹沒系統時開銷的概念有點不妥。新進程的開銷不大,但與os線程不盡相同。主要開銷是進程之間的消息複製,這可以通過使用二進制文件來緩解,因爲只發送二進制文件的引用。通過eterms,結構首先被擴展,然後被複制到其他進程。