3

現在、Erlang のプロセス モデルを研究しています。Erlangに関するテクニカル レポート(セクション 3、パラグラフ 2) で問題が発生しました。

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

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

作者はここで何を言おうとしているのか? 彼は、マルチプロセスの単一スケジューラのケースでは、(複数の一意のノード名を考慮に入れるために) アプリケーションを書き直す必要があることを示唆しようとしていますか?

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

質問はディスカッションを通じて回答されました。以下は私が抱えていたトラブルの概要です。

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

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

4

4 に答える 4

5

記事を読んだ後に書き直す:

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

  • 非 SMP VM にはロックがないため、高速に実行されます。
  • シングル スケジューラ SMP VM は、ロック チェックのコストが原因で 10% 遅くなります
  • ロックの使用/待機が原因で、複数のスケジューラ SMP VM が再び遅くなる

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

  • 私は思う:同じサーバー上のノードには異なる名前が必要です。
  • プロセス間メッセージングは​​、VM ノードのプロセス内メッセージングに対してプロセス間性質のために遅くなります。
于 2009-12-07T20:31:08.080 に答える
2

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

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

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

一方、プロセスが頻繁にやり取りする必要がある場合は、プロセス間通信が異なる VM 間の通信よりもはるかに安価であるため、オプション 1 が適しています。これにより、ロックの競合で失うよりも多くを得ることができます。

于 2009-12-07T21:15:54.150 に答える
1

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

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

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

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

複数のノードがある場合はもちろん、ノード間にロードバランサーが必要になりますが、それはとにかくそれを行うための通常の方法です。ノードを監視するいくつかのロジック。

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

@2009の数字は次のようになります

編集:

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

spawn_opt(fun()-> ... end、[{scheduler、Id}])-> pid()、
    ここで、Idは整数であり、特定のスケジューラーを参照します。

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

于 2009-12-08T21:16:34.813 に答える
1

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

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

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

于 2009-12-07T20:30:15.677 に答える