Erlangでバランスをとるプロセス
-
21-08-2019 - |
質問
誰もが知っていますか?私は、データの非常に大きなセットでいくつかの本当に簡単な操作を持っている場合、私は意味し、すべての項目のためのプロセスを構築するオーバーヘッドは、操作を連続して行うよりも大きくなります。しかし、私は、プロセスの「正しい番号」での仕事のバランスをとることができれば、それはより良い実行されますので、このタスクを達成するための簡単な方法がある場合、私は基本的に求めている。
OTPアプリケーションはバランス負荷のいくつかの種類を行う場合は、ところで、誰もが知っているのでしょうか?私は、OTPアプリケーションに(javaのっぽいスレッドの労働者のような)「ワーカープロセス」の概念があり、どういう意味ですか?
解決
plists
のモジュールは、おそらく何をしたいん。基本的にドロップイン代替品として使用するlists
モジュール、設計の並列実装です。しかし、あなたはまた、どのように多くのワーカープロセスを定義することによって、それは例えば、その操作を並列化する方法を制御することができますがなど生み出されなければならない。
あなたはおそらく、リストの長さやシステムの負荷に応じて労働者のいくつかの数を計算することによってそれを行うだろうなど。
のウェブサイトから:
プレースメントリストのドロップイン置換であります Erlangのモジュールのリストは、ほとんどを作ります リスト操作は平行です。できる 並行して、各要素上で動作します、 IOバウンドの操作のために、サブリストに 並行して、の利点を取るため CPUバウンドのマルチコアマシン 操作、及び、Erlangのノード間 クラスタ内parallizingため。それ エラーやノード障害を処理します。それ 、設定され調整され、かつ微調整することができます 最適なパフォーマンスの中を取得します オーバーヘッドを最小限に抑えます。
他のヒント
モジュールpg2
とpool
を参照してください。
pg2
は非常に単純な分散プロセスのプールを実装しています。 pg2:get_closest_pid/1
は、利用可能な、そうでなければランダムリモートプロセスが「最も近い」PID、すなわちランダムなローカル処理を戻す。
pool
は、ノード間の負荷分散がモジュールslave
を始め実装します。
OTPではありません、私の見解では、便利な汎用的なロードバランシングツールがあります。そして、おそらくそれは、特定の場合に1を持って便利。 1つを自分で実装するのは簡単です。プレースメントリストは、同じ場合に有用である可能性があります。私は本物に代えて、並列ライブラリを信じていません。あなたはこの道を歩けばアムダールは永遠にあなたを悩ませます。
ワーカー・プロセスの適切な数は、スケジューラの数に等しいです。これは、他の作業は、システム上で行われているものの異なる場合があります。使用、
erlang:system_info(schedulers_online) -> NS
スケジューラの数を取得します。
のワーカー・プロセスの豊富なシステムをフラッディングオーバーヘッドの概念はやや不良です。新しいプロセスとオーバーヘッドが、OS-スレッドと限りませんがあります。主なオーバーヘッドはバイナリへの参照のみが送信されるので、これはバイナリを使用して軽減することができ、プロセス間のメッセージのコピーです。 etermsと構成は、第1の他のプロセスにコピーし、次に展開されます。
それは例えばそれを行う対策せずに機械的作業のコストを予測する方法方法はありません。一部の人はタスクのいくつかのクラスの仕事を分割する方法を決定しなければなりません。ロードバランサの言葉で、私はあなたの質問に比べて非常に異なる何かを理解します。