misura del carico della CPU con hyperthreading su linux


12

Come posso ottenere il vero utilizzo di una CPU multi-hyperthreading abilitata?

Ad esempio, consideriamo una CPU a 2 core, che esprime 4 core virtuali.

Un singolo carico di lavoro con thread ora verrebbe visualizzato come 100% top, poiché un core dei core virtuali è completamente utilizzato. La CPU e topfunziona come previsto, come se ci fossero 4 core reali.

Con due thread, tuttavia, le cose si innervosiscono: se tutto funziona bene, sono bilanciati con i due core reali, quindi abbiamo ottenuto il 200% di utilizzo: due volte il 100% e due core virtuali inattivi e utilizzano tutta la potenza della CPU disponibile . Mi sembra ok.

Tuttavia, se i due thread fossero eseguiti su un singolo core reale, verrebbero visualizzati come due volte al 100%, il che fa un uso del core virtuale del 200%. Ma sul lato reale, quello sarebbe un core che condivide la sua potenza sui due thread, che usano quindi solo la metà della potenza totale della CPU.

Pertanto, i numeri di utilizzo indicati da topnon possono essere utilizzati per misurare il carico di lavoro totale della CPU.

Mi chiedo anche come l'hyperthreading bilancia due virtual su un vero core. Se due thread richiedono una diversa quantità di cicli, i core virtuali "si adatteranno" in modo che entrambi mostrino un carico del 100% anche se il carico reale differisce?


1
Capisci che il sistema operatore non è a conoscenza della differenza tra un core virtuale hyperthreading e il core fisico giusto?
Ramhound,

Sembra di sì, ma non è necessario? La mappatura del nucleo reale rispetto a quella virtuale è una mappa una o due semplice. Il problema è come misurare il carico su un core virtuale che in realtà cambia le sue prestazioni disponibili programmando con un altro sul core reale. Ma credo che tutti i dati siano disponibili, la domanda è: dove sono gli strumenti che ottengono un risultato adeguato?
dronus,

1
Mi piace solo avere una misura di carico in cui il 100% significhi che viene utilizzato ogni ciclo di ogni core reale.
dronus,

1
In poche parole: come dire in un determinato momento, se la mia CPU sarebbe in grado di svolgere ulteriori lavori, senza rallentare il lavoro attualmente in corso?
dronus,

1
@Ramhound, quindi se ho un processore fisico a 4 core con 8 core logici e le mie medie di carico dicono 4,00, sono al 100% di utilizzo o al 50%?
Buttle Butkus,

Risposte:


5

Martin Tegtmeier di Oracle ha scritto un interessante post-blog sull'ultimo anno: https://blogs.oracle.com/solaris/cpu-utilization-of-multi-threaded-architectures-explained-v2

La breve risposta; L'hyperthreading fa davvero casino con la capacità di top di riportare le percentuali complessive di cpu-utilizzo / cpu-idle.

Nel peggiore dei casi, una CPU a 2 core a 4 core virtuali che esegue 2 thread al 100% di utilizzo per core potrebbe quasi saturare la CPU. (A seconda dell'utilizzo della porta di esecuzione; solo i thread che utilizzano risorse di elaborazione completamente diverse sulla CPU potrebbero comunque essere eseguiti senza influire sulle prestazioni del thread corrente.) Tuttavia, top in questo caso continuerà a indicare il 50% di inattività.



4

L'utilizzo del core è molto diverso dal carico sul sistema. L'utilizzo del core sta solo mostrando quanto il core sta calcolando qualcosa o sta aspettando istruzioni. Può essere al 100%, che corrisponde a un dato momento in cui la CPU sta calcolando qualcosa.

Ma il carico è una cosa diversa, il carico viene generalmente misurato per determinare se un processo deve attendere o meno una risorsa. Se i processi non attendono risorse, vedrai un sistema molto performante. Ma a volte vedrai sistemi lenti ma basso utilizzo della CPU. Ciò significa generalmente che alcuni processi sono in attesa di una risorsa e non rilasciano la CPU. Per questo tipo di scenario non vedrai un elevato utilizzo della CPU ma il sistema potrebbe essere ben al di sopra della sua capacità.

In un sistema Linux, la media del carico è un valore calcolato per misurare le prestazioni complessive di un sistema. Il valore della media del carico deve essere confrontato con le risorse di calcolo parallelo, i core per essere specifici. Quindi se un sistema con 4 core fisici ha una media di carico di 4 o più, possiamo tranquillamente affermare che alcuni processi aspetteranno una risorsa.

Non è importante se l'utilizzo della CPU è del 100 o 10 percento. La media del carico può arrivare a 200 o 300, in questi casi il sistema sarà a malapena reattivo.

In condizioni operative normali, la media del carico del server non deve superare il numero di core per una lunga durata. I picchi brevi non sono importanti secondo me. 3 numeri che vedrai in un woutput sono load av. per 1/5/15 minuti.


0

Secondo me nessuna delle risposte di cui sopra è soddisfacente.

Penso che l'articolo a cui mi riferisco al seguente link sia ben mirato a rispondere a questa domanda: http://perfdynamics.blogspot.ch/2014/01/monitoring-cpu-utilization-under-hyper.html

CITAZIONE:

L'idea alla base di HT è consentire l'esecuzione di un thread dell'applicazione diverso quando l'app in esecuzione si blocca; a causa di errori di filiale, bolle nella tubazione, ecc. Per renderlo possibile, ci deve essere un'altra porta o un registro AS. Tale registro diventa visibile al sistema operativo quando HT è abilitato. Tuttavia, il sistema operativo (e fino alla catena alimentare per qualsiasi strumento perf che stai usando) ora pensa che sia disponibile il doppio della capacità del processore, ovvero una CPU al 100% su ciascuna porta AS.

Ma sotto il cofano, c'è ancora una sola unità di esecuzione: il singolo, fisico, core con cui hai iniziato prima che HT fosse abilitato. La differenza è che viene condivisa in qualche modo tra le 2 porte AS. Il modo in cui il singolo core viene commutato tra le due porte è molto complicato, ma è più facilmente comprensibile in termini di code polling. Vado a quel livello di dettaglio nelle mie lezioni GCaP.

Le misurazioni dei test più efficaci che ho, indicano che ogni porta HT non può occupare più del 75%, in media, o il 150% della capacità totale prevista del 200% in base al sistema operativo. La capacità "mancante" del 50%, a cui ho fatto riferimento in precedenza, è un'illusione. Intel ha affermato che ci si può aspettare qualcosa tra il 120% e il 130% per le applicazioni generali.

In effetti, sono abbastanza sicuro che il sistema operativo possa raggiungere il 100% su ciascun core virtuale, non c'è dubbio. Ho appena fatto un:

mvn clean install -DskipTests -T 5

E posso assicurarti i miei 8 core virtuali e 4 core fisici sono andati tutti al 100% degli utilizzi della CPU. E sicuramente non ho 8 core sulla mia macchina.

Per farla breve, si può presumere quanto segue se il carico totale della CPU supera il 100% al massimo, e molto probabilmente in modo abbastanza accurato, utilizzando esattamente il 100% del core fisico. Detto questo, se hai CORE 1 fisico diviso in CPU 1 e CPU 2 del sistema operativo e su CPU 1 hai un utilizzo totale del 50% e su CPU 2 hai un utilizzo totale del 50%, molto probabilmente nella vita reale sei mettendo una pressione di un utilizzo totale del 100% su quella CPU. Hai raggiunto il limite massimo.

Ma ovviamente il sistema operativo nei suoi strumenti di monitoraggio del sistema non ha idea che ti stia offrendo un'illusione. Dal punto di vista del sistema operativo e di come gestisce le risorse, crederà che ogni singolo core virtuale sia ancora al 50% inattivo, quindi se ci sono più attività da eseguire cercherà di distribuirle uniformemente su quei due core . Quindi quando si supera il 100% dell'utilizzo della CPU, durante un periodo di utilizzo della CPU, c'è sempre un lavoro in coda da eseguire in quel periodo di tempo che non ha mai avuto un cambiamento per ottenere un cronometro sulla CPU. Alla fine lo otterrà, ma ci sono sempre alcuni thread che in realtà non sono nemmeno in esecuzione anche se sono pianificati per l'esecuzione.

Grazie

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.