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