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

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

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

Я хотел бы изменить «СТАРТ», чтобы назначить для набора заданий четыре случайных ядра, чтобы облегчить проблему. Любые предложения по наилучшему способу сделать это?

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