特定のいくつかのコアでスクリプト内のすべてのコマンド(複数の並列コマンドを含む)を強制的に実行するにはどうすればよいですか?

特定のいくつかのコアでスクリプト内のすべてのコマンド(複数の並列コマンドを含む)を強制的に実行するにはどうすればよいですか?

スクリプトの各コマンドがいくつかの特定のコアでのみ実行されるように、スクリプトの先頭にいくつかのコードを書きたいと思います。たとえば、[command] & [command] & [command] & [command] & [command] など、多くのコマンドが複数の並列で実行されていても、選択したコアの中でのみ実行したいとします。

現在のスクリプトは起動時に独自のPIDを照会し、それをワークセットに提供します。対応するPIDはコア1〜3のみを許可することを伝えます。

ワークセットコマンドの例は次のとおりです。

taskset -c 1-3 -p 45678  

ただし、特定の並列コマンドが実行されると、各コマンドは独自のPIDを持ち、割り当てられたコアに制限されなくなります。

スクリプトのすべての内容が必須コアに残っていることをどのように確認できますか?

答え1

呼び出しプロセスに CPU を設定すると、すべての子プロセスが同じ設定を持つように見えます。

たとえば、次のようになります。

  • screen開始セッションの使用taskset 4 screen

  • セッション中にscreen3つのインスタンスが開始されました。top

他の端末でtopインスタンスの状態を表示するとき:

 for pid in $(ps aux|grep -i top|grep -v grep|awk '{print $2}') ; do taskset -p ${pid} ; done
pid 2505's current affinity mask: 4
pid 2515's current affinity mask: 4
pid 2525's current affinity mask: 4

これはこれを行うbashスクリプトの例です。

#!/bin/bash

echo "Setting CPU affinity ..."
# Bind to a given CPU
taskset  -p 4 $$

# Verify it worked
taskset -p $$

echo "Launching background jobs ..."
# Now, launch several background jobs
for i in $(seq 0 10) ; do 
    tail -f /dev/null &
done

echo "Checking ..."
# Now for each instance of background jobs, check CPU affinity
for pid in $(pidof tail) ; do
    taskset -p ${pid}
done

sleep 1

killall tail

結果出力:

Setting CPU affinity ...
pid 4313's current affinity mask: f
pid 4313's new affinity mask: 4
pid 4313's current affinity mask: 4
Launching background jobs ...
Checking ...
pid 4327's current affinity mask: 4
pid 4326's current affinity mask: 4
pid 4325's current affinity mask: 4
pid 4324's current affinity mask: 4
pid 4323's current affinity mask: 4
pid 4322's current affinity mask: 4
pid 4321's current affinity mask: 4
pid 4320's current affinity mask: 4
pid 4319's current affinity mask: 4
pid 4318's current affinity mask: 4
./test.sh: line 24:  4317 Terminated              tail -f /dev/null
./test.sh: line 24:  4318 Terminated              tail -f /dev/null
./test.sh: line 24:  4319 Terminated              tail -f /dev/null
./test.sh: line 24:  4320 Terminated              tail -f /dev/null
./test.sh: line 24:  4321 Terminated              tail -f /dev/null
./test.sh: line 24:  4322 Terminated              tail -f /dev/null
./test.sh: line 24:  4323 Terminated              tail -f /dev/null
./test.sh: line 24:  4324 Terminated              tail -f /dev/null
./test.sh: line 24:  4325 Terminated              tail -f /dev/null
./test.sh: line 24:  4326 Terminated              tail -f /dev/null
./test.sh: line 24:  4327 Terminated              tail -f /dev/null

関連情報