라이선스가 인스턴스당 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