[ Nota dell'editore:esistono limitazioni note al blocco della CPU in alcuni ambienti, quindi assicurati di leggere i dettagli del tuo ambiente prima di seguire questo tutorial. ]
Le CPU eseguono tutte le applicazioni ed è meglio se capisci come funziona e come puoi ottimizzare l'utilizzo della CPU per aumentare le prestazioni delle tue applicazioni.
I sistemi moderni in genere hanno più CPU e core, che sono condivisi tra tutto il software in esecuzione dallo scheduler del kernel. Quindi normalmente non ti preoccupi di quale CPU/core viene eseguita la tua applicazione o processo, purché sia in esecuzione.
Esistono diversi modi per ottenere più CPU e far funzionare meglio la tua applicazione e renderla più efficiente. Un modo è usare la sintonizzazione prioritaria usando il nice
/renice
comando.
[ Potrebbe interessarti anche: L'unità di elaborazione centrale (CPU):i suoi componenti e le sue funzionalità ]
Il secondo modo è associare l'applicazione a una o più CPU, chiamata "CPU pinning" o "CPU affinity". L'associazione dell'applicazione a una o più CPU specifiche rende tutti i thread o i processi secondari relativi all'applicazione in esecuzione su CPU/CPU definite. In questo modo, limitando il processo/l'applicazione a una o più CPU si ottengono più "cache warm" o "cache hits", aumentando così le prestazioni complessive. Il primo vantaggio dell'affinità della CPU è l'ottimizzazione delle prestazioni della cache. Il secondo vantaggio dell'affinità della CPU è che se più thread accedono agli stessi dati, ha senso eseguirli tutti sullo stesso processore, aiutandoci a ridurre al minimo le perdite di cache.
Metodo 1: ottimizzazione prioritaria
Modificare la priorità del processo utilizzando un nice
comando. Questo è forse il modo più comune conosciuto per migliorare l'utilizzo della CPU di processo/applicazione.
Unix ha sempre fornito un nice()
chiamata di sistema per regolare la priorità del processo, che imposta una bellezza valore. Positivo nice
i valori determinano una priorità del processo inferiore (migliore ) e valori negativi, che possono essere impostati solo dal superutente (root), determinano una priorità più alta.
Il nice
value è ancora utile oggi per regolare la priorità del processo. Il tuo compito è identificare il lavoro a bassa priorità, che può includere agenti di monitoraggio e backup pianificati, che modifichi per iniziare con un nice
valore. Puoi anche eseguire analisi per verificare che l'ottimizzazione sia efficace e che la latenza dello scheduler rimanga bassa per i lavori ad alta priorità.
Come funziona?
A ogni processo viene assegnata una quantità di tempo specificata per l'esecuzione sulla CPU. Il tempo effettivo per il quale il processo è in esecuzione sulla CPU è chiamato runtime virtuale del processo. A proposito, la CPU tende a comportarsi come un padre e ha l'abitudine di dividere equamente il tempo tra tutti i bambini (i processi).
Il tempo totale che un processo trascorre "sulla CPU" è il runtime virtuale del processo. Il sistema operativo (OS) tiene un registro di questo runtime virtuale e cerca di dare lo stesso tempo a tutti i processi nella coda di esecuzione.
Il nice
e renice
le utility manipolano questo runtime virtuale.
Quando alimenti valori positivi con renice
/nice
comandi, ad esempio - renice +10
PID
, stai aggiungendo manualmente più runtime virtuale al processo. Il sistema operativo ritiene che il processo abbia impiegato più tempo di runtime virtuale rispetto ad altri processi nella coda di esecuzione. Quindi nel ciclo successivo, la CPU dedica meno tempo al processo. Il processo termina in ritardo poiché ora sta impiegando meno tempo "su CPU", dopo il renice
comando.
Ma quando alimenti valori negativi con renice
/nice
comandi, ad esempio - renice -10 PID
, stai riducendo manualmente il runtime virtuale del processo. Il sistema operativo ritiene che il processo non abbia abbastanza tempo "su CPU" rispetto ad altri processi nella coda di esecuzione. Quindi, nel ciclo successivo, la CPU concede più tempo "su CPU" a quel processo rispetto ad altri processi nella coda di esecuzione. Il processo terminerà velocemente.
Metodo 2:associazione del processo
Un processo può essere legato a una o più CPU, il che può aumentarne le prestazioni migliorando il calore della cache o riscontri nella cache e località della memoria . Su Linux, questo viene eseguito utilizzando il taskset
comando, che può utilizzare una maschera della CPU o intervalli per impostare l'affinità della CPU.
Utilizzando il taskset
, hai associato il processo 6197 in modo che venga eseguito solo sulla CPU 1. Ciò comporterà più hit di calore/cache della cache. Anche altri processi possono essere eseguiti su CPU 1, ma il processo viene eseguito solo su CPU 1 e CPU 2. Questa configurazione non è permanente. Se il server viene riavviato o il processo viene riavviato, il PID cambierà. Quindi questa configurazione è persa.
Un modo migliore è utilizzare un file "drop-in".
Metodo 3 - Affinità CPU tramite file drop-in
Secondo Wikipedia, Affinità del processore o Blocco della CPU o "affinità cache", consente l'associazione e lo svincolo di un processo o di un thread a un'unità di elaborazione centrale (CPU) o a un intervallo di CPU, in modo che il processo o il thread venga eseguito solo sulla CPU o sulle CPU designate anziché su qualsiasi CPU .
Normalmente, è il kernel che determina le CPU eseguite da un processo. Ogni volta che lo scheduler riprogramma un processo, può passare a una qualsiasi delle CPU disponibili. Sebbene ciò vada bene per la maggior parte dei carichi di lavoro, a volte è opportuno limitare le CPU che un processo può eseguire. Ad esempio, limitare un processo ad alta intensità di memoria a una o due CPU aumenta le possibilità di un hit della cache, aumentando così le prestazioni complessive.
Come funziona?
Nella foto qui, hai tre applicazioni:X, Y e Z. Il comportamento predefinito dello scheduler consiste nell'utilizzare tutte le CPU disponibili per eseguire i thread delle applicazioni X, Y e Z. Utilizzando le impostazioni predefinite, puoi vedere che" Otterrò un buon numero di cache mancate poiché l'applicazione è distribuita su tutte le CPU. Il che porta a un minor numero di accessi alla cache e a più cache miss.
Quando le applicazioni sono bloccate a CPU specifiche, sono obbligate a essere eseguite su CPU specifiche, utilizzando così la cache della CPU in modo più efficace, più codice sulla stessa CPU. In questo modo si ottengono più cache warm/cache hits e quindi un'applicazione con prestazioni migliori.
Per scoprire come utilizzare il blocco della CPU/l'affinità della CPU per associare un processo a determinati processori, aggiungi il sshd
processo alla CPU 0.
Controlla lo stato corrente di sshd
servizio. Stai controllando a quale CPU si collega.
Secondo il taskset
pagine man del comando, valore f
significa "qualsiasi CPU". Quindi non ci sono pinning o binding della CPU configurati per sshd
servizio.
Associa il sshd
servizio alla CPU 0:creazione di un drop-in file che utilizzerai per controllare il comportamento di sshd
servizio. Il file drop-in controlla molte cose relative a un processo, ma al momento ti stai limitando al blocco/affinità della CPU.
Puoi vedere come il taskset
il comando mostra la CPU come "1", che secondo il taskset
man page è la prima CPU disponibile.
Puoi confermare ulteriormente il file drop-in controllando lo stato di sshd
servizio.
Concludi
Puoi utilizzare sia nice
o renice
per modificare la priorità di un processo. Sia il nice
e renice
i comandi possono manipolare il "runtime virtuale" del processo. Quindi, in base ai valori, il processo dedica più o meno tempo alla CPU.
È possibile associare/agganciare un processo a una o più CPU. Ciò aumenta le possibilità di più cache warm/cache hits, ottenendo così prestazioni molto migliori. Puoi utilizzare il taskset
strumento da riga di comando per questo scopo. Ma l'effetto è solo temporaneo. Se vuoi che la configurazione sia persistente, devi utilizzare un file "drop-in".
[ Corso online gratuito:panoramica tecnica di Red Hat Enterprise Linux. ]