讓任務集將作業分配給隨機核心的最佳方法?

讓任務集將作業分配給隨機核心的最佳方法?

我有一個應用程序,其許可證將其限制為每個實例 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

相關內容