Was Sie suchen, sollte in dieser virtuellen Datei zu finden sein:
/sys/devices/system/cpu/isolated
und umgekehrt in
/sys/devices/system/cpu/present // Thanks to John Zwinck
Ab drivers/base/cpu.c Wir sehen, dass die angezeigte Quelle die Kernelvariable cpu_isolated_map ist :
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_map ist genau das, was durch kernel/sched/core.c gesetzt wird beim Booten:
/* 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 beobachtet haben, könnte jemand die Affinität von Prozessen geändert haben, einschließlich der von Dämonen erzeugten, cron , systemd usw. Wenn das passiert, werden neue Prozesse erzeugt, die die modifizierte Affinitätsmaske erben, nicht die von isolcpus festgelegte .
Das Obige ergibt also isolcpus wie Sie es angefordert haben, aber das ist möglicherweise immer noch nicht hilfreich.
Angenommen, Sie finden heraus, dass isolcpus ausgegeben wurde, aber nicht "genommen" wurde, könnte dieses unerwünschte Verhalten auftreten von einem Prozess abgeleitet werden, der erkennt, dass er nur an CPU=0 gebunden ist , glauben, dass es sich versehentlich im Monoprozessormodus befindet, und versuchen hilfreich, "die Dinge in Ordnung zu bringen", indem Sie die Affinitätsmaske zurücksetzen. In diesem Fall könnten Sie versuchen, die CPUs 0-5 anstelle von 1-6 zu isolieren und sehen, ob dies funktioniert.
Eine der einfacheren Möglichkeiten, um zu erkennen, ob isolcpus konsultiert proc um zu sehen, 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, in diesem speziellen Beispiel isolcpus=2,3 wurde als Argument an den laufenden Kernel übergeben.
Sie können auch taskset verwenden zeigte auf PID 1. Da PID 1 die Standard-PID für die erste vom Kernel gestartete Aufgabe ist, können wir als ziemlich guten Hinweis darauf werten, dass sie widerspiegelt, ob wir isolcpus haben Arbeiten. Wie in:
$taskset -cp 1
pid 1's current affinity list: 0,1
Im Vergleich zum lscpu Befehl auf demselben Server:
$lscpu | grep CPU.s
CPU(s): 4
On-line CPU(s) list: 0-3
NUMA node0 CPU(s): 0-3
Wie man sieht, lscpu zeigt 4 CPU/Kerne, während taskset zeigt nur 0,1, also zeigt dies isolcpus arbeitet hier.
Sehen Sie sich an:Wie kann die exklusive CPU-Verfügbarkeit für einen laufenden Prozess sichergestellt werden?
Sie können Cpus_allowed überprüfen und Cpus_allowed_list für den aktuellen Shell-Prozess, um zu sehen, welche CPUs reserviert wurden
cat /proc/$$/status|tail -6
für zB
Cpus_allowed_list: 0-1, 3-5
bedeutet, dass CPU=2 von isolcpus reserviert wurde auf einem 6-CPU-Server