Beste Möglichkeit, einen Job per Taskset zufällig ausgewählten Kernen zuzuweisen?

Beste Möglichkeit, einen Job per Taskset zufällig ausgewählten Kernen zuzuweisen?

Ich habe eine Anwendung, deren Lizenz auf 4 Kerne pro Instanz beschränkt ist und die auf einer 16-Kern-Box läuft. Mehrere dieser Instanzen laufen parallel.

Instanzen werden im Laufe des Tages hoch- und heruntergefahren. In .bash_profile wird die Variable „START“ „taskset -c 0-3 rlwarp ...“ zugewiesen und andere Skripte (oder Menschen auf der Box) starten Instanzen mit $START. Das Endergebnis ist, dass bei hoher Auslastung der Box vier Kerne ausgelastet sein können, während die anderen 12 im Leerlauf laufen.

Ich möchte „START“ ändern, um den Tasksatz vier zufälligen Kernen zuzuweisen und so das Problem zu beheben. Irgendwelche Vorschläge, wie man das am besten macht?

Antwort1

Wenn der Tasksatz eine Liste von Zahlen annehmen kann, wäre ein Ansatz, dies zu tun, um eine Liste mit 4 Zufallszahlen zu erhalten:

$ for (( i=1;i<=16;i++ )) do echo $RANDOM $i; done|sort -k1|cut -d" " -f2|head -4
8
2
15
5

Eine andere grobe Idee wäre, eine Wurzel der Zufallszahl zu finden und 3 wie folgt hinzuzufügen:

$ 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..."

Beispiele

$ 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...

Ultimative Lösung

Chuus endgültige Lösung (als 1-Zeilen-Satz):

$ RTEST=$(($RANDOM % 16));\ 
   taskset -c "$((RTEST%16)),$(((RTEST + 1)%16)),$(((RTEST+2)%16)),$(((RTEST+3)%16))" rlwrap ... 

Wie es funktioniert

Erhalten Sie eine Zufallszahl zwischen 1 und 16:

$ RTEST=$(($RANDOM % 16));
$ echo $RTEST
3

Wenn wir die Modulo-Division viermal durchführen und vorher 1 zu $RTEST hinzufügen, können wir die Zahlen erhöhen, um den Bereich zu generieren:

$ echo $((RTEST%16)),$(((RTEST + 1)%16)),$(((RTEST+2)%16)),$(((RTEST+3)%16))
3,4,5,6

Durch die Modulodivision können Sie eine Zahl optimal eingrenzen, sodass Sie Ergebnisse in einem bestimmten Bereich erhalten.

$ echo $((RTEST%16))
3

$ echo $(((RTEST + 3)%16))
6

Dadurch wird garantiert, dass Sie immer eine Zahl zwischen 1 und 16 erhalten. Es wird sogar der Wraparound behandelt, wenn wir Zufallszahlen über 13 erhalten.

$ echo $(((14 + 3)%16))
1

verwandte Informationen