Quello che cerchi dovrebbe trovarsi all'interno di questo file virtuale:
/sys/devices/system/cpu/isolated
e il contrario in
/sys/devices/system/cpu/present // Thanks to John Zwinck
Da drivers/base/cpu.c
vediamo che la sorgente visualizzata è la variabile del kernel 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);
e cpu_isolated_map
è esattamente ciò che viene impostato da kernel/sched/core.c
all'avvio:
/* 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;
}
Ma come hai osservato, qualcuno potrebbe aver modificato l'affinità dei processi, inclusi quelli generati da un demone, cron
, systemd
e così via. Se ciò accade, verranno generati nuovi processi che ereditano la maschera di affinità modificata, non quella impostata da isolcpus
.
Quindi quanto sopra ti darà isolcpus
come hai richiesto, ma potrebbe comunque non essere utile.
Supponendo di scoprire che isolcpus
è stato emesso, ma non ha "preso", questo comportamento indesiderato potrebbe essere derivato da qualche processo che si rende conto che è legato solo a CPU=0
, credendo che sia in modalità monoprocessore per errore e tentando utilmente di "sistemare le cose" reimpostando la maschera di affinità. In tal caso, potresti provare a isolare le CPUS 0-5 invece di 1-6 e vedere se funziona.
Uno dei modi più semplici per rilevare se isolcpus
sta consultando proc
per vedere quali parametri sono stati passati al kernel in runtime.
Per questo, useresti:
$cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-4.8.0-1-amd64 root=/dev/sda1 ro isolcpus=2,3 quiet
Come puoi vedere, in questo particolare esempio isolcpus=2,3
è stato passato come argomento al kernel in esecuzione.
Puoi anche usare taskset
puntato al PID 1. Dato che il PID 1 è il PID standard per il primo task lanciato dal kernel, possiamo considerare come un'indicazione abbastanza buona che rifletterà se abbiamo isolcpus
Lavorando. Come in:
$taskset -cp 1
pid 1's current affinity list: 0,1
Confronto con il lscpu
comando nello stesso server:
$lscpu | grep CPU.s
CPU(s): 4
On-line CPU(s) list: 0-3
NUMA node0 CPU(s): 0-3
Come si può vedere, lscpu
mostra 4 CPU/core, mentre taskset
mostra solo 0,1, quindi questo mostra isolcpus
funziona qui.
Dai un'occhiata a:Come garantire la disponibilità esclusiva della CPU per un processo in esecuzione?
Puoi selezionare Cpus_allowed e Cpus_allowed_list per l'attuale processo di shell per vedere quali cpus sono state riservate
cat /proc/$$/status|tail -6
per esempio
Cpus_allowed_list: 0-1, 3-5
significa che la cpu=2 è stata riservata da isolcpus
su un server da 6 CPU