![작업 세트가 임의 코어에 작업을 할당하도록 하는 가장 좋은 방법은 무엇입니까?](https://rvso.com/image/50562/%EC%9E%91%EC%97%85%20%EC%84%B8%ED%8A%B8%EA%B0%80%20%EC%9E%84%EC%9D%98%20%EC%BD%94%EC%96%B4%EC%97%90%20%EC%9E%91%EC%97%85%EC%9D%84%20%ED%95%A0%EB%8B%B9%ED%95%98%EB%8F%84%EB%A1%9D%20%ED%95%98%EB%8A%94%20%EA%B0%80%EC%9E%A5%20%EC%A2%8B%EC%9D%80%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
라이선스가 인스턴스당 4개 코어로 제한되고 16개 코어 상자에서 실행되는 애플리케이션이 있습니다. 이러한 인스턴스 중 일부는 병렬로 실행됩니다.
인스턴스는 하루 종일 계속해서 회전합니다. .bash_profile에서 "START" 변수는 "taskset -c 0-3 rlwarp ..."에 할당되고 다른 스크립트(또는 상자에 있는 사람)는 $START를 사용하여 인스턴스를 시작합니다. 최종 결과는 상자의 부하가 높을 때 4개의 코어가 고정되고 나머지 12개는 유휴 상태로 실행될 수 있다는 것입니다.
문제를 완화하는 데 도움이 되도록 4개의 무작위 코어에 작업 세트를 할당하도록 "START"를 수정하고 싶습니다. 이를 수행하는 가장 좋은 방법에 대한 제안이 있습니까?
답변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