![讓任務集將作業分配給隨機核心的最佳方法?](https://rvso.com/image/50562/%E8%AE%93%E4%BB%BB%E5%8B%99%E9%9B%86%E5%B0%87%E4%BD%9C%E6%A5%AD%E5%88%86%E9%85%8D%E7%B5%A6%E9%9A%A8%E6%A9%9F%E6%A0%B8%E5%BF%83%E7%9A%84%E6%9C%80%E4%BD%B3%E6%96%B9%E6%B3%95%EF%BC%9F.png)
我有一個應用程序,其許可證將其限制為每個實例 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