Лучший способ назначить задачу случайным ядрам?

Лучший способ назначить задачу случайным ядрам?

У меня есть приложение, лицензия которого ограничивает его 4 ядрами на экземпляр, работающее на 16-ядерном блоке. Несколько таких экземпляров работают параллельно.

Экземпляры вращаются вверх и вниз в течение дня. В .bash_profile переменная "START" назначается "taskset -c 0-3 rlwarp ...", а другие скрипты (или люди на коробке) запускают экземпляры с помощью $START. Конечный результат заключается в том, что когда коробка находится под большой нагрузкой, вы можете оказаться с четырьмя загруженными ядрами, в то время как остальные 12 работают вхолостую.

Я хотел бы изменить "START", чтобы назначить, чтобы tasket назначался четырем случайным ядрам, чтобы помочь смягчить проблему. Есть предложения по лучшему способу сделать это?

решение1

Если taskset может принимать список чисел, то одним из подходов для получения списка из 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...

Окончательное решение

Окончательное решение Чу (в одну строку):

$ 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 раза, предварительно добавив 1 к $RTEST, мы сможем увеличить числа для генерации диапазона:

$ 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

Связанный контент