複数のCPUを持つ(osX)サーバーに接続しています。さまざまな入力ファイルに対してプログラムを実行したいと思います。 1つずつ実行します。
for input in "${inputs[@]}"
do
.<my-program.sh> --input $input
done
これは非常に遅く、全体のCPU性能を使用しないので、代わりに並列に実行したいと思います。
新しい独立画面を開き、その中でプログラムを実行したいと思います。たとえば、次のようになります。
for input in "${inputs[@]}"
do
screen -S test -X screen .<my-program.sh> --input $input
done
各画面は異なるCPUで動作しますか(使用可能なCPU性能を使用したいですか?)コマンドは正しいですか?それとも、各入力に対して新しいシェルを開く必要がありますか(別のCPUで実行する必要があるとします)。
ベストアンサー1
質問に直接答えるには、CPU固定を使用して特定のプロセスを特定のCPUに手動で割り当てない限り、オペレーティングシステムは通常、その時点で処理できる「最高の」CPUと思われるタスクを実行するようにスケジュールします。マシンが同時に実行する他のタスクに応じて、複数のCPUコア間を前後に移動することもできます。
これに対する実際の結果は、プログラムの5つのインスタンスを実行すると可能5つの独立したCPUで実行されますが、保証されません。〜する別のCPUで実行されます。各個々のプロセスがCPU容量の20%未満を使用している場合は、5つのプロセスすべてが同じプロセッサで実行される可能性がありますが、可能性は低いです。
より広い状況を解決するために多くのファイルを処理し、少量のCPUパフォーマンスしか使用しないプログラムがある場合、ボトルネックはディスクI / O容量である可能性が高くなります。この場合、速度を上げるにはより高速なディスク(または同じデータを繰り返し読み取る場合はより大きなディスクキャッシュ)が必要であり、複数のプロセスとCPU間で並列化することが実際に可能です。減らすディスクが最初のインスタンスへの入力ファイルの読み取りと各プロセスの追加のファイル読み取りとの間の切り替えに時間を費やすことでパフォーマンスを向上させます。
ディスクI / Oがボトルネックを引き起こすかどうかをテストするための迅速で簡単な方法は、cat file_1 file_2 file_3... >/dev/null
(file_1
メディアはプログラムが処理するすべてのファイルのリストです)、ファイルを読み取るのにかかる時間(処理なし)と時間を比較することです。です。処理に時間がかかります。