To, co hledáte, by se mělo nacházet uvnitř tohoto virtuálního souboru:
/sys/devices/system/cpu/isolated
a naopak v
/sys/devices/system/cpu/present // Thanks to John Zwinck
Od drivers/base/cpu.c
vidíme, že zobrazený zdroj je proměnná jádra 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);
a cpu_isolated_map
je přesně to, co nastavuje kernel/sched/core.c
při spouštění:
/* 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;
}
Ale jak jste si všimli, někdo mohl upravit afinitu procesů, včetně procesů vytvořených démonem, cron
, systemd
a tak dále. Pokud k tomu dojde, vytvoří se nové procesy, které zdědí upravenou masku afinity, nikoli tu nastavenou isolcpus
.
Výše uvedené vám tedy dá isolcpus
jak jste požadovali, ale stále to nemusí být užitečné.
Předpokládejme, že zjistíte, že isolcpus
byl vydán, ale „neprobral“, toto nežádoucí chování mohlo být odvozen nějakým procesem, který si uvědomí, že je vázán pouze na CPU=0
, v domnění, že je omylem v monoprocesorovém režimu, a užitečně se pokoušejí "uvést věci do pořádku" resetováním masky afinity. Pokud tomu tak bylo, můžete zkusit izolovat CPU 0-5 místo 1-6 a zjistit, zda to náhodou funguje.
Jeden ze snadnějších způsobů, jak zjistit, zda isolcpus
konzultuje proc
abyste viděli, které parametry byly předány jádru za běhu.
K tomu byste použili:
$cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-4.8.0-1-amd64 root=/dev/sda1 ro isolcpus=2,3 quiet
Jak můžete vidět, v tomto konkrétním příkladu isolcpus=2,3
byl předán jako argument běžícímu jádru.
Můžete také použít taskset
ukázal na PID 1. Protože PID 1 je standardní PID pro první úlohu spuštěnou jádrem, můžeme považovat za docela dobrý náznak toho, že bude odrážet, zda máme isolcpus
pracovní. Jako v:
$taskset -cp 1
pid 1's current affinity list: 0,1
Porovnání s lscpu
příkaz na stejném serveru:
$lscpu | grep CPU.s
CPU(s): 4
On-line CPU(s) list: 0-3
NUMA node0 CPU(s): 0-3
Jak je vidět, lscpu
zobrazuje 4 CPU/jádra, zatímco taskset
zobrazuje pouze 0,1, takže to ukazuje isolcpus
zde pracuje.
Podívejte se na:Jak zajistit exkluzivní dostupnost CPU pro běžící proces?
Můžete zkontrolovat Cpus_allowed a Cpus_allowed_list pro aktuální proces shellu, abyste viděli, jaké procesory byly rezervovány
cat /proc/$$/status|tail -6
např.
Cpus_allowed_list: 0-1, 3-5
znamená, že cpu=2 bylo rezervováno isolcpus
na serveru se 6 procesory