ワークセットに任意のコアにタスクを割り当てさせる最善の方法は何ですか?

ワークセットに任意のコアにタスクを割り当てさせる最善の方法は何ですか?

ライセンスがインスタンスごとに4コアに制限され、16コアボックスで実行されるアプリケーションがあります。これらのインスタンスのいくつかは並列に実行されます。

インスタンスは一日中上下に回転します。 .bash_profileでは、変数「START」は「taskset -c 0-3 rlwarp ...」に割り当てられ、他のスクリプト(またはコンピュータのユーザー)は$ STARTを使用してインスタンスを起動します。最終結果は、ボックスの負荷が高いときに4つのコアが固定され、残りの12個のコアがアイドル状態にある可能性があることです。

この問題を軽減するのに役立つように、「START」を変更してワークセットを4つのランダムコアに展開したいと思います。最善のアプローチの提案がありますか?

答え1

ワークセットが数値リストを取得できる場合、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つ):

$ 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

関連情報