web-dev-qa-db-ja.com

マルチコアCLIコマンドの質問

12コアのマシンで、ファイル内で実行する150個のCLIコマンドのコレクションがあります。 150のタスクすべてをバックグラウンドで実行すると、システムがダウンします。経験から、12〜18のタスクを実行するのが最適であることがわかりました。

以前は、splitコマンドを使用して、150個のコマンドを12個または13個のバッチファイルに分割し、それぞれを実行していました。ただし、一部のバッチファイルは他のファイルよりも先に終了し、最終的に3つまたは4つのバッチファイルが他の9つまたは8つのコアがアイドル状態のときに他のファイルよりも終了に時間がかかります。

私の目標は、150個のCLIコマンドがすべて実行されるまで、12個のコアすべてを実行し続けることです。

各プロセッサに150のCLIコマンドリストから1つのタスクを取得させ、そのコマンドを実行中としてマークし、プロセッサが互いにつまずいて取得することなく、150がすべて完了するまで、他の11のプロセッサに独自の項目を取得させることは可能ですか?同じCLIコマンド?ファイルの書き込みは一意である必要があります。

これを行う簡単な方法はありますか?

2
Randall

GNU Parallelを使用すると、次のようになります。

cat 150commands.txt | parallel

コアごとに1つのジョブを実行します。

GNU Parallelは一般的な並列処理機能であり、同じマシンまたはsshにアクセスできる複数のマシンでジョブを簡単に並列実行できます。多くの場合、forループを置き換えることができます。

4つのCPUで実行する32の異なるジョブがある場合、並列化する簡単な方法は、各CPUで8つのジョブを実行することです。

Simple scheduling

代わりに、GNU Parallelは、終了時に新しいプロセスを生成します。つまり、CPUをアクティブに保ち、時間を節約します。

GNU Parallel scheduling

インストール

GNU Parallelがディストリビューション用にパッケージ化されていない場合は、rootアクセスを必要としない個人インストールを実行できます。これを行うことで10秒で実行できます。

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

その他のインストールオプションについては、 http://git.savannah.gnu.org/cgit/parallel.git/tree/README を参照してください。

詳細

その他の例を参照してください: http://www.gnu.org/software/parallel/man.html

イントロビデオを見る: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

チュートリアルをウォークスルーします: http://www.gnu.org/software/parallel/parallel_tutorial.html

サポートを受けるためにメーリングリストにサインアップしてください: https://lists.gnu.org/mailman/listinfo/parallel

2
Ole Tange