![タスクセットにジョブをランダムなコアに割り当てる最適な方法は何ですか?](https://rvso.com/image/50562/%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%BB%E3%83%83%E3%83%88%E3%81%AB%E3%82%B8%E3%83%A7%E3%83%96%E3%82%92%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E3%81%AA%E3%82%B3%E3%82%A2%E3%81%AB%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6%E3%82%8B%E6%9C%80%E9%81%A9%E3%81%AA%E6%96%B9%E6%B3%95%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
ライセンスによってインスタンスあたり 4 コアに制限されているアプリケーションを 16 コア ボックスで実行しています。これらのインスタンスのいくつかは並列に実行されます。
インスタンスは 1 日を通して起動したり停止したりします。.bash_profile では、変数 "START" が "taskset -c 0-3 rlwarp ..." に割り当てられ、他のスクリプト (またはボックス上の人間) が $START を使用してインスタンスを起動します。その結果、ボックスに重い負荷がかかっているときに、4 つのコアが固定され、他の 12 個がアイドル状態になることがあります。
問題を軽減するために、「START」を変更して、タスクセットを 4 つのランダムなコアに割り当てるようにしたいと思います。これを行うための最良の方法について何か提案はありますか?
答え1
タスクセットが数値のリストを取得できる場合、4 つのランダムな数値のリストを取得するには、次のようにします。
$ for (( i=1;i<=16;i++ )) do echo $RANDOM $i; done|sort -k1|cut -d" " -f2|head -4
8
2
15
5
もう 1 つの大まかなアイデアとしては、次のようにルート乱数を見つけてそれに 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