GNU Parallelはより多くの並列プロセスを実行できますか?

GNU Parallelはより多くの並列プロセスを実行できますか?

たとえば、次のように実行できます。

parallel -j 200 < list0

「リスト」には以下が含まれます。

nice -n -20 parallel -j 100 < list2
nice -n -20 parallel -j 100 < list1

これは可能ですか/可能ですか?

答え1

これは可能であるだけでなく可能です。場合によってはこれが推奨されます。

GNU Parallelは、ジョブの実行に約10ミリ秒かかります。したがって、8つのコアがあり、70ミリ秒未満のタスクを実行している場合は、1つのコアを100%使用するGNU Parallelを表示できますが、他のコアにはアイドル時間があります。したがって、すべてのコアを100%使用するわけではありません。

-j0推奨されるもう1つの状況は、実際に実行できるよりも多くのタスクを実行したい場合です。現在、-j0特定のシステム制限を調整しない限り、約250のジョブが並列に実行されます。ジョブがCPUとディスクI / Oによって制限されない場合は、250を超えるジョブを実行するのが妥当です。たとえば、ネットワーク待ち時間が制限要因であるとします。

ただし、2つのリストを使用することは、タスクを分割するための推奨方法ではありません。推奨される方法は、GNU Parallel を使用して GNU Parallel を呼び出すことです。

cat list0 | parallel -j20 --pipe parallel -j100

これにより、2000のジョブが並列に実行されます。より多くの調整が必要です-j。各コアに1つ以上のGNU並列プロセスがあるように、コアの数は外部(20)以上であることをお勧めします。

この技術を使用すると、20,000のタスクを並列に開始することに問題はありません。 32,000個のプロセスを超えると、問題が発生し始めます。

初めて実行すると:

echo 4194304 | sudo tee /proc/sys/kernel/pid_max

私は実行できます:

seq 1000000 2000000000 |
  parallel -j16 --roundrobin --pipe parallel -j0 --pipe parallel -j0 sleep

100万のプロセスを並列に実行します(私のシステムには300G RAMが必要です)。

答え2

なぜこれが不可能なのかわかりません。システムは確実に同時に200の並列操作を処理できます。

ただし、正確な数のジョブを並列に実行する特別な理由がない限り、これはほとんど推奨されません。私が見ることができる唯一の理由は、同時に存在する必要があるか、情報を交換する必要があるか、混乱して定義されていない方法(サーバープログラムのテストなど)で他のものと必要なためです。

これが望ましくない理由は、効率性の観点から、システムが使用可能なプロセッサコアの数と同じ数のプロセスを実行するのが理想的な状況であるからである。このプロセスは、CPU の外部 (ディスク I/O など) である程度ボトルネックが発生することが多いため、この広い理想的な数値の範囲はコア数 +1 からコア数 *2 までです。

これが理想的な効率である理由は、タスク自体が100万単位のプロセッサ時間を消費する場合、同じタスクを順次10回実行すると1000万単位が消費され、同じタスクを並列に実行すると1000万単位が消費されるためです。ただし、後者の場合、CPU個数が10個未満の場合には追加料金がありますシステムは、あるジョブから別のジョブに継続的に切り替える必要があるためです。

これは理由一般的に言えば2 x 2 Ghzコアを持つシステムは、4 x 1 Ghzコアを持つシステムよりも高速です。マルチコアシステム開発の主な理由は、より高速で高速なCPUを作成することが不可能になる、比較的低い特定のポイントを超えてますます困難になるためです。したがって、解決策は、より多くのプロセッサコアを持つシステムを作成することです。

簡単に言えば、できるだけ早く20の作業を実行する必要があり、コアが4つの場合、最速の方法は4回5セットまたは5回4セットで空き時間を確保することです。入出力。parallel可変長のリストを提供できますが、一度に実行するジョブの数を制限します(この数値のデフォルトはコア数です)。

これには例外がありますが、通常は特定の種類の単一マルチスレッドプログラム(別々のプログラムの束ではなく複数のコアを占める単一のプログラム)に関連しています。これは、プログラムが時々調整する必要がある比較的独立したブランチを介して作業を実行できることがより簡単でより効率的であるためです(「時々」はまだ1秒あたり10〜20回です)。任意の(非同期)方法でタスクを繰り返すように設計する代わりに、別のスレッドでこれを実行してください。ビデオゲームやCADシステムなどのグラフィック集約型および/またはインタラクティブプログラムがこのカテゴリに属します。

関連情報