让任务集将作业分配给随机核心的最佳方法?

让任务集将作业分配给随机核心的最佳方法?

我有一个应用程序,其许可证将其限制为每个实例 4 个核心,在 16 核盒子上运行。其中几个实例并行运行。

实例全天上下旋转。在 .bash_profile 中,变量“START”被分配给“taskset -c 0-3 rlwarp ...”,其他脚本(或机器上的人员)使用 $START 启动实例。最终结果是,当盒子处于重负载时,您可能会发现 4 个核心处于固定状态,而其他 12 个核心则处于闲置状态。

我想修改“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-liner):

$ 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

相关内容