작업 세트가 임의의 코어에 작업을 할당하도록 하는 가장 좋은 방법은 무엇입니까?

작업 세트가 임의의 코어에 작업을 할당하도록 하는 가장 좋은 방법은 무엇입니까?

라이선스가 인스턴스당 4코어로 제한되고 16코어 상자에서 실행되는 애플리케이션이 있습니다. 이러한 인스턴스 중 일부는 병렬로 실행됩니다.

인스턴스는 하루 종일 위아래로 회전합니다. .bash_profile에서 "START" 변수는 "taskset -c 0-3 rlwarp ..."에 할당되고 다른 스크립트(또는 컴퓨터의 사용자)는 $START를 사용하여 인스턴스를 시작합니다. 최종 결과는 상자의 부하가 높을 때 4개의 코어가 고정되어 있고 나머지 12개의 코어는 유휴 상태로 있을 수 있다는 것입니다.

이 문제를 완화하는 데 도움이 되도록 "START"를 수정하여 작업 세트를 4개의 임의 코어에 배포하고 싶습니다. 최선의 접근 방식에 대한 제안이 있으십니까?

답변1

작업 세트가 숫자 목록을 얻을 수 있는 경우 한 가지 방법은 이를 수행하여 4개의 임의 숫자 목록을 얻는 것입니다.

$ for (( i=1;i<=16;i++ )) do echo $RANDOM $i; done|sort -k1|cut -d" " -f2|head -4
8
2
15
5

또 다른 대략적인 아이디어는 루트 난수를 찾아 여기에 3을 더하는 것입니다. 다음과 같습니다.

$ baseCPU=$(for (( i=1;i<=13;i++ )) do echo $RANDOM $i; done|sort -k1|cut -d" " -f2 | head -1)
$ echo "taskset -c ${baseCPU}-$(expr $baseCPU + 3) rlwarp..."

$ baseCPU=$(for (( i=1;i<=13;i++ )) do echo $RANDOM $i; done|sort -k1|cut -d" " -f2 | head -1)
$ echo "taskset -c ${baseCPU}-$(expr $baseCPU + 3) rlwarp..."
taskset -c 1-4 rlwarp...

$ baseCPU=$(for (( i=1;i<=13;i++ )) do echo $RANDOM $i; done|sort -k1|cut -d" " -f2 | head -1)
$ echo "taskset -c ${baseCPU}-$(expr $baseCPU + 3) rlwarp..."
taskset -c 2-5 rlwarp...

$ baseCPU=$(for (( i=1;i<=13;i++ )) do echo $RANDOM $i; done|sort -k1|cut -d" " -f2 | head -1)
$ echo "taskset -c ${baseCPU}-$(expr $baseCPU + 3) rlwarp..."
taskset -c 12-15 rlwarp...

마지막 해결책

Chuu의 최종 솔루션(1개짜리):

$ RTEST=$(($RANDOM % 16));\ 
   taskset -c "$((RTEST%16)),$(((RTEST + 1)%16)),$(((RTEST+2)%16)),$(((RTEST+3)%16))" rlwrap ... 

어떻게 작동하나요?

1-16 사이의 임의의 숫자를 얻으십시오:

$ RTEST=$(($RANDOM % 16));
$ echo $RTEST
3

모듈로 나누기를 4번 수행한 다음 $RTEST에 1을 추가하면 숫자를 증가시켜 범위를 생성할 수 있습니다.

$ echo $((RTEST%16)),$(((RTEST + 1)%16)),$(((RTEST+2)%16)),$(((RTEST+3)%16))
3,4,5,6

모듈러 나누기를 수행하는 것은 특정 범위 내에서 결과를 얻을 수 있도록 숫자를 구간화하는 좋은 방법입니다.

$ echo $((RTEST%16))
3

$ echo $(((RTEST + 3)%16))
6

이렇게 하면 항상 1에서 16 사이의 숫자를 얻을 수 있습니다. 13보다 큰 난수를 얻을 때 래핑도 처리할 수 있습니다.

$ echo $(((14 + 3)%16))
1

관련 정보