3

私は Elixir の初心者で、Dave Thomas の優れたProgramming Elixirを読み始めています。「pmap」関数の同時実行性をどこまで高めることができるかに興味があったので、2 乗する項目の数を 1,000 から 10,000,000 に繰り返し増やしました。好奇心から、私が行った出力を観察したところhtop、通常は以下に示すような CPU 使用率でピークに達しました。

htop 出力

本で例を示した後、デイブは次のように述べています。

そして、はい、1,000 のバックグラウンド プロセスを開始し、マシンのすべてのコアとプロセッサを使用しました。

私の質問は、なぜ私のマシンでコア 1、3、5、および 7 だけが点灯しているのかということです。私の推測では、私のiexプロセスが単一の OS レベルのプロセスであり、OSX がそのプロセスの範囲を管理していることに関係していると思います。それがここで起こっていることですか?すべてのコアがパフォーマンス集約型のタスクに確実に使用されるようにする方法はありますか?

4

2 に答える 2

2

同時実行は並列処理ではありません

Elixir/BEAM コーディングから優れた並列パフォーマンスを得るには、BEAM スケジューラーがどのように機能するかをある程度理解する必要があります。

これは非常に単純化されたモデルですが、BEAM スケジューラは、プロセスを次のプロセスに交換する前に、各プロセスに 2000 の削減を与えます。リダクションは、関数呼び出しと考えることができます。デフォルトでは、プロセスはそれを生成したコア/スケジューラで実行されます。未処理のプロセスのキューが特定のスケジューラーで蓄積された場合にのみ、プロセスはスケジューラー間で移動されます。デフォルトでは、BEAM は使用可能なコアごとにスケジューリング スレッドを実行します。

これが意味することは、プロセッサを最大限に活用するには、タスクを、標準的な「削減」作業スライスを超える十分な大きさの作業に分割する必要があるということです。一般に、pmap スタイルの並列処理では、多くの項目を 1 つのタスクにチャンクする場合にのみ大幅な速度向上が得られます。

もう 1 つ注意する必要があるのは、BEAM の一部は、作業を待機しているときにスピン/待機ループを使用し、htopCPU 使用率を調べるようなツールを使用するときに使用率を歪める可能性があることです。を使用すると、プログラムのパフォーマンスをよりよく理解できます:observer

于 2016-04-25T22:50:58.587 に答える