특정 몇 개의 코어에서 스크립트의 모든 명령(여러 병렬 명령 포함)을 강제로 실행하려면 어떻게 해야 합니까?

특정 몇 개의 코어에서 스크립트의 모든 명령(여러 병렬 명령 포함)을 강제로 실행하려면 어떻게 해야 합니까?

스크립트의 각 명령이 몇 개의 특정 코어에서만 실행되도록 스크립트 시작 부분에 일부 코드를 작성하려고 합니다. 예를 들어 [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

관련 정보