Erlang Documentation / SMP:マシンごとまたはアプリケーションごとのシングルノードとマルチノード、およびそれに続く混乱

erlang ipc scheduled-tasks smp
Erlang Documentation / SMP:マシンごとまたはアプリケーションごとのシングルノードとマルチノード、およびそれに続く混乱

現在、Erlangのプロセスモデルを研究しています。 Erlangのhttp://www.erlang.org/euc/08/euc_smp.pdf[tech report](セクション3、パラグラフ2)でひっかかった:

_
これは、いくつかの場合に、複数のスケジューラーを持つ1つのSMP VM上で代わりにそれぞれ1つのスケジューラーを持つ複数のSMP VMを実行する方が効率的である理由を説明しています。 もちろん、複数のVMを実行するには、アプリケーションが互いに通信しないか、ほとんど通信しない多くの並列タスクで実行できる必要があります。
_

今、この段落は私を混乱させています。単一プロセスの複数スケジューラのシナリオを見ることができますが、単一のスケジューラで複数のプロセスを見ることはできません。おそらく、各プロセスには*異なるノード名*があり、これは特定のアプリケーションを変更せずにこのモデルで使用できないことを意味します。 変更を必要としないことの長所*は、レポートでSMPの重要な特徴として言及されています。 *複数のプロセスが同じノード名を持っている場合、Erlangプロセス間のメッセージングストームのためにパフォーマンスが悲惨になるよりも、メモリ内健忘症の使用を想定しています。 記事で紹介されておらず、ここに欠けているプロセスモデルはありますか?

ここで著者が言っていることは何ですか? 彼は、複数プロセスの単一スケジューラの場合、アプリケーションを(複数の一意のノード名を考慮するために)書き換える必要があることを提案しようとしていますか?

  • 編集1:問題の原因の明確化-

質問は議論を通じて回答されました。以下は私が抱えていたトラブルの概要です。

この質問の問題は、私が思い出すように、ドキュメントは物理マシンごとに複数のErlangエミュレータを実行するシナリオに触れていないということでした-エミュレータは物理産業を表していることが常に示されています(産業用);また、計算効率のためにプログラムを明示的に分割しなければならないシナリオは考慮されていません。 この突然の紹介が私の悲惨さの原因となっています。

慣習は依然としてプロセスの多くを作成する方向に偏っており、将来はErlangのSMPエミュレーターの多くの改善を保持しています。これは、マシンごとに単一ノードが好ましいアプリケーション設計を前提とする非常に実行可能なオプションであることを意味します

  2  0


ベストアンサー

記事を読んだ後に書き換える:

_
これは、複数のスケジューラを備えた1つのSMP VMで代わりに、1つのスケジューラを備えた複数のSMP VMを実行する方が効率的な場合がある理由を説明しています。
_

  • 非SMP VMにはロックがないため、高速で実行されます。

  • ロックをチェックするコストが原因で、シングルスケジューラSMP VMが10%遅くなります。

  • ロックの使用/待機のために複数のスケジューラSMP VMが再び遅くなります

_
もちろん、複数のVMを実行するには、アプリケーションが互いに通信しないか、ほとんど通信しない多くの並列タスクで実行できる必要があります。
_

  • I think:同じサーバー上のノードには異なる名前を付ける必要があります。

  • プロセス間のメッセージングにより、プロセス間のメッセージングが遅くなります
    VMノードの自然対プロセス内メッセージング。

5


単一のVMに複数のスケジューラーがある場合、それらは必然的にさまざまなリソース(たとえば、 etsメタテーブル、アトムテーブル、移行中のスケジューラ実行キューなど)。内部アーキテクチャのため。 スケジューラが1つしかない場合、競合は明らかに発生しません。 ただし、ロックのチェックと取得は引き続き行われるため、代わりに非SMP VMを実行するとパフォーマンスがさらに向上します(ただし、ソースからVMを再構築する必要があります)。

たとえば、4コアマシンを取り上げます。 オプション1は、Erlang VMの4つのインスタンスを実行することを意味します。各インスタンスには単一のスケジューラがあり、アフィニティは異なるプロセッサコアに設定されています。 オプション2は、4つのスケジューラを使用して単一のErlang VMを実行し、各スケジューラのアフィニティを異なるプロセッサコアに設定することを意味します。

実行する独立したプロセスが非常に多い場合、4つのコアが(理論的に)完全に使用されるため、オプション2の方がパフォーマンスが向上します。 対照的に、オプション1では、ロックの競合によりコアでの実行が時々互いに待機するため、これは不可能です。

一方、プロセスで頻繁にチャタリングする必要がある場合は、プロセス間通信が異なるVM間の通信よりもはるかに安価であるため、オプション1を使用する方法があります。 これにより、ロック競合で失うよりも多くを得ることができます。

2


答えは前の段落にあると思います:

_
スケジューラが1つしかないSMP VMは、非SMP VMよりもわずかに遅い(10%)。 これは、SMP VMがすべての共有データ構造にロックを使用する必要があるためです。 ただし、ロックの競合がない限り、ロックによって発生するオーバーヘッドはそれほど大きくありません(時間がかかるのはロックの競合です)。
_

共有データ構造のロックへのスケジューラの依存は、特定のシステムにオーバーヘッドを課す可能性があります。 1つのSMP VM上に複数のスケジューラを配置すると、全体として大きなオーバーヘッドが発生するようです。

1


1台の物理マシン上に複数のノードを持ついくつかのadvatangesがあります。

1)前述のリソースロックのオーバーヘッド。

2)フェールオーバー。 テレコム製品では、ビームがあなたに衝突するのは本当に望ましくありません。 システムにNIFまたはリンクインドライバーがある場合、これが発生する可能性があります。

3)メモリの局所性。 少数のノードでは、プロセスを少数のコアに強制する貧弱な方法を提供します。 これは通常、NUMAアーチだけでなく、SMPにとっても大きな後押しになる可能性があります。 スケジューラはNUMAを考慮しません(まだ)。 特定のスケジューラにプロセスを生成してロックすることができますが、移行はされませんが、それは文書化されていない機能です…​ または一緒に削除されました。 忘れます。

複数のノードを使用する場合、当然ながらノード間にロードバランサーが必要になりますが、それがとにかく通常の方法です。 ノードを監視するロジック。

ただし、EUCの論文の数字は1年以上前のものです[@]。本当に必要ない場合は、マルチノードアプローチはお勧めしません。 ランタイムシステムは、今日この種の問題を処理するのに非常に優れています。 多くのロックオーバーヘッドが削除され、mrq-schedulerが改善されました。

@ 2009の番号は、http://www.erlang-factory.com/upload/presentations/188/ErlangUserConference2009-PatrikNyblom.pdf [this]のようになります。

編集:

3)に関して私が言及したスポーン機能は、

spawn_opt(fun() -> ... end, [{scheduler, Id}]) -> pid(),
    where Id is an integer and refers to a specific scheduler.

文書化されていないため、使用しないことをお勧めします。

1


タイトルとURLをコピーしました