Wie erkennt man, ob Isolcpus aktiviert ist?

15

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-7auf einem 6 Kern i7, scheint isolcpus beim Booten nicht aktivieren, und ich würde , wenn seine möglich wissen, aus /proc/, /sysoder 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 dmesgkein Startprotokoll mehr angezeigt wird, um Fehler beim Start zu erkennen. Grundlegende Antwort wie " Blick auf Kernel-Cmd-Zeile " wird nicht akzeptiert :)

Netmonk
quelle
1
Kannst du verwenden pidstat -C isolcpus. pidstat ist aus dem sysstatPaket.
Timothy Pulliam
2
Mag im dumm sein, aber ich sehe keine Verbindung zwischen pidstatund isolcpus. Können Sie etwas näher darauf eingehen?
Netmonk
Sie müssen wissen, auf welchen CPUs der Befehl ausgeführt wird. Ich weiß nicht, was es isolcpusist, pidstatkann Ihnen aber sagen, auf welcher CPU ein Prozess ausgeführt wird, wenn Sie das -C process_nameFlag übergeben. Zum Beispiel pidstat -C toperzeugt 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
Timothy Pulliam
2
Ok, danke für deine Antwort. isolcpusist ein Kernel-Parameter, der den Scheduler zwingt, keinen Prozess selbst zu migrieren, wenn er isoliert ist. Zum Beispiel erzwingt auf einem 8-CPU-Server isolcpus=1-7in 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 starten taskset. In Bezug auf das, was ich frage, scheint Ihre Antwort nicht zum Thema zu gehören.
Trotzdem
1
So etwas sollte wirklich nicht schwierig sein ...
user997112

Antworten:

17

Was Sie suchen, sollte sich in dieser virtuellen Datei befinden:

/sys/devices/system/cpu/isolated

und umgekehrt in

/sys/devices/system/cpu/present    // Thanks to John Zwinck

Aus sehen drivers/base/cpu.cwir, dass die angezeigte Quelle die Kernelvariable ist cpu_isolated_map:

static ssize_t print_cpus_isolated(struct device *dev,
    n = scnprintf(buf, len, "%*pbl\n", cpumask_pr_args(cpu_isolated_map));
...
static DEVICE_ATTR(isolated, 0444, print_cpus_isolated, NULL);

und cpu_isolated_mapgenau das wird kernel/sched/core.cbeim Booten eingestellt:

/* Setup the mask of cpus configured for isolated domains */
static int __init isolated_cpu_setup(char *str)
{
    int ret;

    alloc_bootmem_cpumask_var(&cpu_isolated_map);
    ret = cpulist_parse(str, cpu_isolated_map);
    if (ret) {
            pr_err("sched: Error, all isolcpus= values must be between 0 and %d\n", nr_cpu_ids);
            return 0;
    }
    return 1;
}

Aber wie Sie bemerkt haben, hätte jemand die Affinität von Prozessen ändern können, einschließlich von Dämonen erzeugter Prozesse cron, systemdund so weiter. In diesem Fall werden neue Prozesse erzeugt, die die geänderte Affinitätsmaske erben, nicht die von isolcpus.

Das obige gibt Ihnen also, isolcpuswie Sie es gewünscht haben, aber das ist möglicherweise immer noch nicht hilfreich.

Angenommen , dass Sie das herausfinden, isolcpusausgestellt wurde, aber nicht „genommen“ hat, dieses unerwünschte Verhalten könnte durch einige Verfahren zu realisieren abgeleitet werden , dass sie nur gebunden ist CPU=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.

LSerni
quelle
1
Beachten Sie, dass auf Centos 7.x getestet wurde, dass /sys/devices/system/cpu/possibledies nicht das Gegenteil ist, je nachdem, wie Sie das Gegenteil interpretieren. ZB wenn .../cpu/isolatedRückkehr, 2,4weil sie isoliert worden waren, .../cpu/possiblewürde zurückkehren 0-191.
Bgura
1
Ich denke, die meisten Leute würden sich wünschen, /sys/devices/system/cpu/presentwelche Shows welche CPUs existieren, anstatt /sys/devices/system/cpu/possiblewelche 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.
John Zwinck
@ JohnZwinck guter Fang. Änderungsantwort
LSerni
1
Mit isolcpus = 0 und 4 Kernen erhalte ich / isoliert = 0 und / present = 0-3.
Stefan Reich
10

Eine der einfacheren Möglichkeiten, um festzustellen, ob dies der Fall ist, isolcpusbesteht darin, zu prüfen proc, welche Parameter zur Laufzeit an den Kernel übergeben wurden.

Dafür würden Sie verwenden:

$cat /proc/cmdline 
BOOT_IMAGE=/boot/vmlinuz-4.8.0-1-amd64 root=/dev/sda1 ro isolcpus=2,3 quiet

Wie Sie sehen können, wurde in diesem speziellen Beispiel isolcpus=2,3ein Argument an den laufenden Kernel übergeben.

Sie können auch tasksetPID 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 wir isolcpusarbeiten. Wie in:

$taskset -cp 1
pid 1's current affinity list: 0,1

Vergleich mit dem lscpuBefehl auf demselben Server:

$lscpu | grep CPU.s
CPU(s):                4
On-line CPU(s) list:   0-3
NUMA node0 CPU(s):     0-3

Wie zu sehen lscpuist, werden 4 CPU / Kerne angezeigt, während tasksetnur 0,1 angezeigt werden. Dies zeigt isolcpusalso , dass dies hier funktioniert.

Schauen Sie sich Folgendes an: Wie kann die exklusive CPU-Verfügbarkeit für einen laufenden Prozess sichergestellt werden?

Rui F Ribeiro
quelle
Vielen Dank, Sir, für Ihre Antwort, aber ich werde es nicht akzeptieren. Ich habe angegeben, dass eine Antwort über die Kernel-Befehlszeile nicht akzeptiert wird. Ich weiß natürlich, /proc/cmdlinewelche Kopie des Inhalts der grub.confDatei genau ist . Das habe ich nicht gefragt! Trotzdem danke !
Netmonk
Ich habe der Antwort hinzugefügt.
Rui F Ribeiro
1
Was hat jemand zuvor die Affinität von Processus zum Task-Set geändert? Was ist, wenn jemand die Init-Affinität nur auf CPU 0 setzt? Gibt es dann Informationen über die Aktivierung oder Nicht-Aktivierung der isolierten CPU?
Netmonk
1

Sie können Cpus_allowed und Cpus_allowed_list auf den aktuellen Shell-Prozess überprüfen, um festzustellen , welche CPUs reserviert wurden

cat /proc/$$/status|tail -6

für zB

Cpus_allowed_list:      0-1, 3-5

bedeutet, dass die CPU = 2 von isolcpusauf einem 6-CPU-Server reserviert wurde

Valentin
quelle
2
Nicht wirklich. Es zeigt, welche CPUs sich in der Affinitätsmaske befinden, die vom aktuellen Shell-Prozess geerbt wurde. Wenn dies beispielsweise der Fall wäre sshund die Affinität des übergeordneten sshdElements manuell zu CPU 1 begrenzt worden wäre, würde immer CPU 1 angezeigt, unabhängig isolcpusdavon , ob "genommen" wurde oder nicht. Der $$Zweig gibt Ihnen die prozessvererbten Werte an, nicht die ursprünglichen Systemwerte.
LSerni