web-dev-qa-db-ja.com

限られたCPUコアのみで並列実行

12コアのサーバーがあり、ファイルを入力引数として取り、処理を行うスクリプトを実行したいと考えています。 8コアを使用し、8コアで一度に8ファイルの並列処理を実行し、1の処理が完了したら、次へジャンプする必要はありません。

私はxargsでそれをやってみました:

ls /data/paths/ | grep new | xargs -i -P 8 -n 1 bash main.sh {}

しかし、コアを見ると、CPU使用率はスナップショットに添付されています。 enter image description here

私はまた、次のように並列でやってみました:

ls /data/paths/ | grep new | parallel -j 8 --no-notice bash main.sh {}

8 CPUに制限する必要があるという私の条件。

編集:

実行するとps -ef | grep main.sh 8ではなく11〜12のプロセスが表示されます。

3
nainometer

taskset を使用して、プロセスのCPUアフィニティを設定できます。以下により、xargsコマンドが最初の8つの仮想CPUコアのみを使用するようになります。

ls /data/paths/ | grep new | taskset -c 0-7 xargs -i -P 8 -n 1 bash main.sh {}

manタスクセット から注意してください:

プロセスのCPUアフィニティを変更するには、ユーザーはCAP_SYS_Niceを所有している必要があります。

3
Gohu