4

erlang標準ライブラリに一種の「ロードバランサ」があるかどうか知っている人はいますか? つまり、非常に大きなデータセットに対して非常に単純な操作を行う場合、すべてのアイテムのプロセスを構築するオーバーヘッドは、操作を順番に実行するよりも大きくなります。しかし、「適切な数」のプロセスで作業のバランスをとることができれば、パフォーマンスが向上するので、基本的にこのタスクを達成する簡単な方法があるかどうかを尋ねています.

ところで、OTP アプリケーションがある種の負荷分散を行っているかどうか知っている人はいますか? つまり、OTP アプリケーションには「ワーカー プロセス」(Java っぽいスレッド ワーカーのような) という概念がありますか?

4

4 に答える 4

13

モジュールpg2とを参照してくださいpool

pg2非常に単純な分散プロセス プールを実装します。pg2:get_closest_pid/1「最も近い」pid、つまり、利用可能な場合はランダムなローカル プロセス、そうでない場合はランダムなリモート プロセスを返します。

poolmodule で開始されたノード間の負荷分散を実装しますslave

于 2009-02-04T14:06:59.183 に答える
3

モジュールはplistsおそらくあなたが望むことをします。これは基本的にlistsモジュールの並列実装であり、ドロップインの代替として使用されるように設計されています。ただし、たとえば、生成するワーカープロセスの数を定義するなどして、操作を並列化する方法を制御することもできます。

リストの長さやシステムの負荷などに応じて、ワーカーの数を計算することで、おそらくそれを行うでしょう。

ウェブサイトから:

plistsはErlangモジュールリストのドロップイン置換であり、ほとんどのリスト操作を並列化します。各要素を並列に、IOバウンド操作の場合、サブリストを並列に操作し、CPUバウンド操作を備えたマルチコアマシンを利用し、erlangノード全体を操作してクラスター内を並列化できます。エラーとノード障害を処理します。オーバーヘッドを最小限に抑えながら最適なパフォーマンスを実現するように構成、調整、および調整できます。

于 2009-02-05T14:02:51.060 に答える
1

私の見解では、otp には有用な一般的な負荷分散ツールはありません。そして、おそらく、特定の場合にのみ使用すると便利です。自分で実装するのは簡単です。plists は、同じ場合に役立つ場合があります。私は、並列ライブラリが本物の代わりになるとは考えていません。この道を歩けば、アムダールは永遠にあなたを悩ませるでしょう。

ワーカー プロセスの適切な数は、スケジューラの数と同じです。これは、システムで行われている他の作業によって異なる場合があります。使用する、

erlang:system_info(schedulers_online) -> NS

スケジューラの数を取得します。

大量のワーカー プロセスでシステムがあふれたときのオーバーヘッドの概念には、多少の誤りがあります。新しいプロセスにはオーバーヘッドがありますが、OS スレッドほどではありません。主なオーバーヘッドは、プロセス間のメッセージのコピーです。これは、バイナリへの参照のみが送信されるため、バイナリを使用して軽減できます。eterms では、最初に構造が展開され、次に他のプロセスにコピーされます。

于 2009-05-01T21:39:48.960 に答える