Ich versuche, Multithread-Benchmarks auf einer Reihe isolierter CPUs auszuführen. Um es kurz zu machen, ich habe es zunächst mit isolcpus
und versucht, bin taskset
aber auf Probleme gestoßen . Jetzt spiele ich mit cgroups / csets.
Ich denke, der "einfache" cset shield
Anwendungsfall sollte gut funktionieren. Ich habe 4 Kerne, daher möchte ich die Kerne 1-3 für das Benchmarking verwenden (ich habe diese Kerne auch so konfiguriert, dass sie sich im adaptiven Ticks-Modus befinden), dann kann Kern 0 für alles andere verwendet werden.
Nach dem Tutorial hier sollte es so einfach sein wie:
$ sudo cset shield -c 1-3
cset: --> shielding modified with:
cset: "system" cpuset of CPUSPEC(0) with 105 tasks running
cset: "user" cpuset of CPUSPEC(1-3) with 0 tasks running
Jetzt haben wir also ein "Schild", das isoliert ist (das Benutzer-Cset) und Kern 0 ist für alles andere (das System-Cset).
Okay, sieht soweit gut aus. Nun schauen wir uns an htop
. Die Prozesse sollten alle auf CPU 0 migriert worden sein:
Huh? Einige der Prozesse laufen auf den abgeschirmten Kernen. Um den Fall auszuschließen, dass htop einen Fehler aufweist, habe ich auch versucht taskset
, die Affinitätsmaske eines Prozesses zu untersuchen, der sich im Schild befindet.
Vielleicht waren diese Aufgaben unbeweglich? Lassen Sie uns einen beliebigen Prozess zupfen, der auf CPU3 ausgeführt wird (der sich im Schild befinden sollte), htop
und prüfen, ob er in der System-C-Gruppe wie folgt angezeigt wird cset
:
$ cset shield -u -v | grep 864
root 864 1 Soth [gmain]
vext01 2412 2274 Soth grep 864
Ja, das läuft auf der Systemgruppe nach cset
. Also htop
und nicht cset
einverstanden.
Also, was ist hier los? Wem vertraue ich: CPU-Affinitäten ( htop
/ taskset
) oder cset
?
Ich vermute, dass Sie nicht cset
und Affinitäten zusammen verwenden sollen. Vielleicht funktioniert der Schild gut, und ich sollte die Affinitätsmasken und die htop
Ausgabe ignorieren . In jedem Fall finde ich das verwirrend. Kann jemand etwas Licht ins Dunkel bringen?
quelle
numactl
und dascgconfig
undcgrules
/ oder umcgred
zu rationalisieren, was Sie tun. Diese können für Debian mit einigen Arbeiten verfügbar sein .Antworten:
Aus der cpusets-Dokumentation :
Dies impliziert, dass CPU-Affinitätsmasken mit dem CPU in der Gruppengruppe, zu der der Prozess gehört, geschnitten werden.
Wenn beispielsweise die Affinitätsmaske eines Prozesses die Kerne {0, 1, 3} enthält und der Prozess auf der System-cgroup ausgeführt wird, die auf die Kerne {1, 2} beschränkt ist, muss der Prozess auf Kern 1 ausgeführt werden.
Ich bin zu 99% sicher, dass die
htop
Ausgabe "falsch" ist, da die Prozesse seit der Erstellung der cgroups nicht mehr aktiviert wurden und auf dem Display der letzte Kern angezeigt wird, auf dem der Prozess ausgeführt wurde.Wenn ich vim starte, bevor ich meinen Schild mache, gabelt sich vim zweimal (aus irgendeinem Grund) und das tiefste Kind läuft auf Kern 2. Wenn ich dann den Schild mache, dann schlafe vim (Strg + z) und wecke ihn, beide Prozesse haben Ich denke, dies bestätigt die Hypothese,
htop
dass veraltete Informationen angezeigt werden.Sie können auch
/proc/<pid>/status
diecpus_allowed_*
Felder inspizieren und betrachten .ZB habe ich hier einen
console-kit-daemon
Prozess (pid 857), der in htop als auf Kern 3 laufend angezeigt wird, aber in/proc/857/status
:Ich denke, dies bedeutet, dass die Affinitätsmaske 0x1 ist, was aufgrund der cgroups erlaubt, nur auf Kern 1 zu laufen: dh intersect ({0,1,2,3}, {0}) = {0}.
Wenn ich kann, lasse ich die Frage eine Weile offen, um zu sehen, ob eine bessere Antwort kommt.
Vielen Dank an @davmac für die Hilfe (auf irc).
quelle