So erkennen Sie, ob und auf welchem CPU isolcpus aktiviert ist, wenn Sie beispielsweise zum ersten Mal eine Verbindung auf einem Server herstellen. Bedingungen:
Es wird kein Prozess erzeugt, um zu sehen, wohin er migriert wird.
Der Anwendungsfall ist , dass isolcpus=1-7
auf einem 6 Kern i7, scheint isolcpus beim Booten nicht aktivieren, und ich würde , wenn seine möglich wissen, aus /proc/
, /sys
oder jegliche Kernel - Einbauten , die im Userspace gelesen werden können, einen klaren Status der Aktivierung von isolcpus bereitzustellen und welche CPU betroffen sind. Oder lesen Sie sogar die aktive Einstellung des Schedulers, der als erster von isolcpus betroffen ist.
Bedenken Sie, dass die Betriebszeit so groß ist, dass dmesg
kein Startprotokoll mehr angezeigt wird, um Fehler beim Start zu erkennen. Grundlegende Antwort wie " Blick auf Kernel-Cmd-Zeile " wird nicht akzeptiert :)
pidstat -C isolcpus
. pidstat ist aus demsysstat
Paket.pidstat
undisolcpus
. Können Sie etwas näher darauf eingehen?isolcpus
ist,pidstat
kann Ihnen aber sagen, auf welcher CPU ein Prozess ausgeführt wird, wenn Sie das-C process_name
Flag übergeben. Zum Beispielpidstat -C top
erzeugt das folgende.10:56:52 AM PID %usr %system %guest %CPU CPU Command 10:56:52 AM 3457 0.00 0.00 0.00 0.00 6 top
isolcpus
ist ein Kernel-Parameter, der den Scheduler zwingt, keinen Prozess selbst zu migrieren, wenn er isoliert ist. Zum Beispiel erzwingt auf einem 8-CPU-Serverisolcpus=1-7
in der Kernel-Befehlszeile, dass alle von init und jeder Art von Befehl in der Shell gespaltenen erzeugten Prozesse nur auf CPU0 ausgeführt werden. Um eine Aufgabe auf einer isolierten CPU auszuführen, müssen Sie sie beispielsweise mit startentaskset
. In Bezug auf das, was ich frage, scheint Ihre Antwort nicht zum Thema zu gehören.Antworten:
Was Sie suchen, sollte sich in dieser virtuellen Datei befinden:
und umgekehrt in
Aus sehen
drivers/base/cpu.c
wir, dass die angezeigte Quelle die Kernelvariable istcpu_isolated_map
:und
cpu_isolated_map
genau das wirdkernel/sched/core.c
beim Booten eingestellt:Aber wie Sie bemerkt haben, hätte jemand die Affinität von Prozessen ändern können, einschließlich von Dämonen erzeugter Prozesse
cron
,systemd
und so weiter. In diesem Fall werden neue Prozesse erzeugt, die die geänderte Affinitätsmaske erben, nicht die vonisolcpus
.Das obige gibt Ihnen also,
isolcpus
wie Sie es gewünscht haben, aber das ist möglicherweise immer noch nicht hilfreich.Angenommen , dass Sie das herausfinden,
isolcpus
ausgestellt wurde, aber nicht „genommen“ hat, dieses unerwünschte Verhalten könnte durch einige Verfahren zu realisieren abgeleitet werden , dass sie nur gebunden istCPU=0
, zu glauben , es in Monoprozessor - Modus durch einen Fehler ist, und helfend versuchen, „Set Dinge rechts "durch Zurücksetzen der Affinitätsmaske. In diesem Fall könnten Sie versuchen, CPUS 0-5 anstelle von 1-6 zu isolieren, und prüfen, ob dies funktioniert.quelle
/sys/devices/system/cpu/possible
dies nicht das Gegenteil ist, je nachdem, wie Sie das Gegenteil interpretieren. ZB wenn.../cpu/isolated
Rückkehr,2,4
weil sie isoliert worden waren,.../cpu/possible
würde zurückkehren0-191
./sys/devices/system/cpu/present
welche Shows welche CPUs existieren, anstatt/sys/devices/system/cpu/possible
welche zeigen, welche CPUs möglicherweise existieren könnten (aber derzeit möglicherweise nicht existieren). Auf einigen Systemen sind sie gleich, aber selbst auf einem ziemlich einfachen Desktop, den ich überprüft habe, sind sie es nicht.Eine der einfacheren Möglichkeiten, um festzustellen, ob dies der Fall ist,
isolcpus
besteht darin, zu prüfenproc
, welche Parameter zur Laufzeit an den Kernel übergeben wurden.Dafür würden Sie verwenden:
Wie Sie sehen können, wurde in diesem speziellen Beispiel
isolcpus=2,3
ein Argument an den laufenden Kernel übergeben.Sie können auch
taskset
PID 1 verwenden. Da PID 1 die Standard-PID für die erste vom Kernel gestartete Aufgabe ist, können wir als ziemlich guten Hinweis darauf nehmen, dass sie widerspiegelt, ob wirisolcpus
arbeiten. Wie in:Vergleich mit dem
lscpu
Befehl auf demselben Server:Wie zu sehen
lscpu
ist, werden 4 CPU / Kerne angezeigt, währendtaskset
nur 0,1 angezeigt werden. Dies zeigtisolcpus
also , dass dies hier funktioniert.Schauen Sie sich Folgendes an: Wie kann die exklusive CPU-Verfügbarkeit für einen laufenden Prozess sichergestellt werden?
quelle
/proc/cmdline
welche Kopie des Inhalts dergrub.conf
Datei genau ist . Das habe ich nicht gefragt! Trotzdem danke !Sie können Cpus_allowed und Cpus_allowed_list auf den aktuellen Shell-Prozess überprüfen, um festzustellen , welche CPUs reserviert wurden
für zB
bedeutet, dass die CPU = 2 von
isolcpus
auf einem 6-CPU-Server reserviert wurdequelle
ssh
und die Affinität des übergeordnetensshd
Elements manuell zu CPU 1 begrenzt worden wäre, würde immer CPU 1 angezeigt, unabhängigisolcpus
davon , ob "genommen" wurde oder nicht. Der$$
Zweig gibt Ihnen die prozessvererbten Werte an, nicht die ursprünglichen Systemwerte.