Ich habe ein Python-Skript geschrieben, das einfach einige Threads hochfährt und CPU-Zyklen brennt. Die Idee ist, das Task-Set dagegen zu testen, da es ganz einfach ist.
#!/usr/bin/env python
import threading
def cycle_burner():
while True:
meh = 84908230489 % 323422
for i in range(3):
thread = threading.Thread(target=cycle_burner)
print "Starting a thread"
thread.start()
Das Ausführen des Python-Skripts verbraucht etwa 150% der CPU-Auslastung.
[~/cbench]$ ./burn_cycles.py
Starting a thread
Starting a thread
Starting a thread
Das Starten meines Python-Skripts mit dem Task-Set funktioniert wie erwartet. Oben sehen Sie den Python-Prozess, der zu 100% ausgelastet ist.
[~/cbench]$ taskset -c 0 ./burn_cycles.py
Starting a thread
Starting a thread
Starting a thread
Interessanterweise begrenzt das Starten des Python-Skripts und das sofortige Verwenden des Task-Sets zum Festlegen der Affinität des gerade gestarteten Prozesses den Prozess auf 100%. Beachten Sie aus der Ausgabe, dass der Linux-Scheduler die Ausführung der Bash-Befehle beendet hat, bevor die Python-Threads erzeugt werden. Also wurde der Python-Prozess gestartet, dann wurde er so eingestellt, dass er auf CPU 0 ausgeführt wird, und dann wurden seine Threads erzeugt, die die richtige Affinität erbten.
[~/cbench]$ ./burn_cycles.py &; taskset -pc 0 `pgrep python`
[1] 8561
pid 8561's current affinity list: 0-3
pid 8561's new affinity list: 0
Starting a thread
[~/cbench]$ Starting a thread
Starting a thread
Dieses Ergebnis steht im Gegensatz zu dieser Methode, die genau dieselbe ist, aber es den Python-Threads ermöglicht, zu erscheinen, bevor die Affinität des Python-Prozesses festgelegt wird. Dies repliziert die oben beschriebenen Ergebnisse "Taskset macht nichts".
[~/cbench]$ ./burn_cycles.py &
[1] 8996
[~/cbench]$ Starting a thread
Starting a thread
Starting a thread
[~/cbench]$ taskset -pc 0 `pgrep python`
pid 8996's current affinity list: 0-3
pid 8996's new affinity list: 0
Was läuft hier falsch?
Anscheinend erben Threads, die erzeugt wurden, bevor die Affinität des übergeordneten Prozesses geändert wurde, nicht die Affinität des übergeordneten Prozesses. Wenn jemand einen Link zur Dokumentation bearbeiten könnte, der dies erklärt, wäre dies hilfreich.