come rilevare se isolcpus è attivato?


15

Come rilevare se isolcpus è attivato e su quale cpus, ad esempio quando ci si connette per la prima volta su un server. condizioni:

non genera alcun processo per vedere dove verrà migrato.

Il caso d'uso è che isolcpus=1-7su un i7 a 6 core, sembra non attivare isolcpus all'avvio, e vorrei sapere se è possibile da /proc/, /syso qualsiasi interno del kernel che può essere letto nello spazio utente, per fornire un chiaro stato di attivazione di isolcpus e quali CPU sono interessati. O anche leggere l'impostazione attiva dello scheduler che è il primo interessato da isolcpus.

Considera che il tempo di attività è così grande che dmesgnon viene più visualizzato il registro di avvio per rilevare eventuali errori all'avvio. La risposta di base come " guarda la riga cmd del kernel " non sarà accettata :)


1
È possibile utilizzare pidstat -C isolcpus. pidstat proviene dal sysstatpacchetto.
Timothy Pulliam,

2
Potrebbe essere stupido, ma non vedo alcun collegamento tra pidstate isolcpus. Puoi approfondire un po 'di più?
Netmonk,

Dici che devi sapere su quali CPU è in esecuzione il comando. Non so cosa isolcpussia, ma pidstatposso dirti su quale CPU è in esecuzione un processo se passi la -C process_namebandiera. Ad esempio pidstat -C topproduce quanto segue. 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 grazie per la tua risposta. isolcpusè un parametro del kernel che forza lo scheduler a non migrare alcun processo da solo se sono isolati. Ad esempio su un server 8 cpu, isolcpus=1-7nella riga di comando del kernel, forzerà l'esecuzione di tutti i processi generati dalla fork e di ogni tipo di comando nella shell solo su CPU0. Per eseguire un'attività su una CPU isolata, è necessario avviarla con tasksetad esempio. Quindi per quanto riguarda ciò che sto chiedendo, sembra che la tua risposta sia fuori tema. Grazie comunque per aver cercato di rispondermi
netmonk,

1
Qualcosa del genere non dovrebbe essere difficile ....
user997112

Risposte:


17

Quello che cerchi dovrebbe essere trovato all'interno di questo file virtuale:

/sys/devices/system/cpu/isolated

e viceversa

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

Da drivers/base/cpu.cnoi vediamo che il sorgente visualizzato è 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);

ed cpu_isolated_mapè esattamente ciò che viene impostato kernel/sched/core.call'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 avrebbe potuto modificare l'affinità dei processi, inclusi quelli generati da daemon cron, systemde così via. In tal caso, verranno generati nuovi processi ereditando la maschera di affinità modificata, non quella impostata da isolcpus.

Quindi quanto sopra ti darà isolcpuscome richiesto, ma potrebbe non essere ancora utile.

Supponendo di scoprire che isolcpusè stato emesso, ma non "preso", questo comportamento indesiderato potrebbe essere derivato da qualche processo rendendosi conto che è legato solo CPU=0, credendo che sia in modalità monoprocessore per errore, e tentando utile di "impostare le cose right "ripristinando la maschera di affinità. In tal caso, potresti provare a isolare CPUS 0-5 invece di 1-6 e vedere se questo funziona.


1
Testato su Centos 7.x, nota che /sys/devices/system/cpu/possiblenon sembra essere "inverso" a seconda di come interpreti "inverso". Ad esempio, se .../cpu/isolatedritorna 2,4perché erano stati isolati, .../cpu/possiblesarebbe tornato 0-191.
bgura,

1
Penso che la maggior parte delle persone vorrebbe /sys/devices/system/cpu/presentche mostra quali CPU esistono, piuttosto /sys/devices/system/cpu/possibleche quali CPU potrebbero esistere (ma al momento potrebbero non esistere). Su alcuni sistemi sono uguali, ma anche su un desktop piuttosto semplice che ho controllato, non lo sono.
John Zwinck,

@JohnZwinck buona cattura. risposta rettificativa
LSerni

1
Con isolcpus = 0 e 4 core, sto ottenendo / isolato = 0 e / presente = 0-3.
Stefan Reich,

10

Uno dei modi più semplici per rilevare se si isolcpussta consultando procper vedere quali parametri sono stati passati al kernel in fase di esecuzione.

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 esempio particolare è isolcpus=2,3stato passato come argomento al kernel in esecuzione.

Puoi anche usare tasksetPID 1. puntato Dal momento che PID 1 è il PID standard per la prima attività avviata dal kernel, possiamo prendere come una buona indicazione che rifletterà se stiamo isolcpuslavorando. Come in:

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

Confronto con il lscpucomando 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, lscpumostra 4 CPU / core, mentre tasksetmostra solo 0,1, quindi questo programma isolcpusfunziona qui.

Dai un'occhiata a: Come garantire la disponibilità esclusiva della CPU per un processo in esecuzione?


Grazie signore per la sua risposta, ma non la accetterò. ho specificato che la risposta parlando della riga di comando del kernel non sarà accettata. ovviamente so /proc/cmdlinequal è la copia esatta del contenuto del grub.conffile. Questo non è quello che ho chiesto! Grazie lo stesso !
Netmonk,

Ho aggiunto alla risposta.
Rui F Ribeiro,

1
Qual è qualcuno precedentemente modificato l'affinità di processus con tasket? cosa succede se qualcuno imposta l'affinità init solo su cpu 0, mi dà qualche informazione sull'attivazione o meno di isol cpu?
Netmonk,

1

Puoi controllare Cpus_allowed e Cpus_allowed_list per il processo di shell corrente per vedere quali cpus erano riservati

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

per es

Cpus_allowed_list:      0-1, 3-5

significa che cpu = 2 è stato prenotato da isolcpusun server 6 cpus


2
In realtà ... no. Mostra quali CPU sono nella maschera di affinità ereditata dal processo di shell corrente. Se fosse, diciamo, sshe uno avesse limitato manualmente l'affinità del genitore sshdcon la CPU 1, vedresti sempre la CPU 1, isolcpus"presa" o meno. Il $$ramo fornisce i valori ereditati dal processo, non quelli di sistema originali.
LSerni il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.