Ich versuche, einen Prozess auf eine bestimmte Anzahl von CPU-Kernen zu beschränken. Gemäß der Taskset-Manpage und dieser Dokumentation sollte Folgendes funktionieren:
[fedora@dfarrell-opendaylight-cbench-devel ~]$ taskset -pc 0 <PID>
pid 24395's current affinity list: 0-3
pid 24395's new affinity list: 0
Einfach gesagt - das funktioniert nicht. Wenn Sie den Prozess unter Last setzen und beobachten top
, liegt die CPU-Auslastung bei etwa 350% (wie ohne Task-Set). Es sollte maximal 100% betragen.
Ich kann die Affinität über die taskset -c 0 <cmd to start process>
Prozess-Spawn-Zeit richtig einstellen . Verwenden funktioniertcpulimit -p <PID> -l 99
auch irgendwie . In beiden Fällen führt eine maximale Belastung des Prozesses zu einer maximalen CPU-Auslastung von 100%.
Was läuft hier falsch?
Antworten:
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.
Das Ausführen des Python-Skripts verbraucht etwa 150% der CPU-Auslastung.
Das Starten meines Python-Skripts mit dem Task-Set funktioniert wie erwartet. Oben sehen Sie den Python-Prozess, der zu 100% ausgelastet ist.
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.
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".
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.
quelle
-a
in den Kommentaren der Frage vorgeschlagenen Parameter aufzunehmen . Ich habe es versucht und es hat bei mir funktioniert.Ich denke, Sie müssen das Task-Set einmal pro Thread aufrufen, dh
ps -eL
anstelle von verwendenpgrep
und das an weiterleitentaskset -cp 0
Dies ruft den Task-Set für alle Thread-IDs auf.
quelle
Versuchen Sie stattdessen numactl mit
--physcpubind
(oder-C
). Die Manpage sagt:(In neueren Versionen von
taskset
gibt es auch eine-a
Option, dieSets or retrieves the CPU affinity of all the tasks (threads) for a given PID.
jedoch nicht klar ist, ob dies auch für Tochterprozesse einer gestarteten Aufgabe funktionierttaskset
, anstatt einen bereits laufenden Prozess zu ändern.)quelle
-a
mit bereits ausgeführten Prozessen.Ich benutze
taskset
die-a
Option erfolgreich. Ich habe einen Server namens videoconverterd, der viel CPU verbraucht.top
zeigt anNach dem Ausführen
taskset -apc 0 8991
sinkt die CPU-Last aufIch verwende CentOS 7 mit
taskset
Version 2.23.2.quelle