我有一个应用程序,其许可证将其限制为每个实例 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