Cosa succede a più attività parallele in esecuzione su un server quando la CPU raggiunge il 100% di utilizzo?

4

Sono in esecuzione 10 istanze dello stesso eseguibile in cui ogni eseguibile accede a un diverso blocco di 1/10 dei dati totali che devono essere elaborati su Windows Server 2012 R2. (Intel (R) Xeon (R) 2,4 GHz (2 processori), 64 GB di RAM)

La mia domanda è se la CPU raggiunge il 100% di utilizzo, le 10 istanze sono ancora processate in parallelo? Oppure la CPU inizia a sequenziarli invece di elaborarli parallelamente? Sto meglio riducendo semplicemente il numero di istanze fino a quando l'utilizzo della CPU è inferiore al 100%?

    
posta hkf 30.06.2017 - 00:13
fonte

3 risposte

9

My question is if the CPU hits 100% usage, are the 10 instances still being parallel processed?

Sì.

Or Does the CPU start sequencing them instead of parallel processing them?

Probabilmente il tuo processore non ha 10 core CPU, quindi sì, lo sta facendo anche in alcune sequenze. Ma improvvisamente non esegue un thread fino al completamento quando arriva al 100%. Sta usando lo swap per dare ad ogni thread una sezione temporale ; e lo fa se è al 100% o no.

Am I better off simply reducing the number of instances till the CPU usage is less than 100%?

No, vuoi il 100% di utilizzo della CPU, oppure stai sprecando cicli!

Tuttavia, questo non è nemmeno vicino all'intera storia e, al 100%, la CPU non è una grande misura dell'efficienza dei cicli della CPU che vengono utilizzati.

Probabilmente dovresti eseguire tutti i thread del processore con core CPU. (Se si utilizzano processi a thread singolo, contarli come thread). Quando si esegue più di questo, il sistema operativo scambia i thread dentro e fuori i core della CPU in un equilibrio di equità e altre politiche che assegna a ciascun thread un fetta di tempo qua e là.

Lo swapping causa vari tipi di overhead: overhead diretto mentre i cicli vengono sprecati facendo swap invece del lavoro, e overhead indiretto, che ha a che fare con il funzionamento delle cache: le memorie a più alta velocità direttamente sul processore. Le cache formano un livello della gerarchia di memoria, che include anche la memoria principale (i 16+ GB di RAM) e in definitiva include anche il disco come forma di memoria. L'utilizzo della gerarchia della memoria è la chiave per il throughput delle prestazioni.

Poiché ogni thread viene eseguito per un po 'di tempo, occuperà parte della cache per i propri scopi. In un certo senso, la cache si sta scaldando fino a quel thread, e questo è buono.

Quando il sistema operativo è in grado, fornirà una porzione di tempo consecutivo allo stesso thread sullo stesso processore, e il thread avrà una cache calda per iniziare.

Troppi thread in una volta causano l'annullamento dell'inquinamento della cache dovuto al fatto che vengono scambiati: quando un thread viene scambiato per la prima volta, la cache si raffredderà e dovrà scaldarsi prima di arrivare a miglior rendimento.

Tuttavia, elaborare un set di dati di grandi dimensioni in modo efficiente non richiede solo la gestione dei core ma anche un utilizzo migliore della gerarchia della memoria.

Un approccio per trovare un buon modo per suddividere il lavoro, che puoi modificare e perfezionare in base ai tempi, è qualcosa di simile a questo:

Dividi l'intero lavoro in una dimensione del blocco della dimensione della cache del processore di grandi dimensioni (L3, forse).

Quindi dividi ogni pezzo di lavoro in sezioni di tutti i processori che il processore ha (ad esempio 2, 4) ed esegui quelli. Quindi, al completamento di tali sezioni, esegui le sezioni successive del blocco successivo.

Molto ha a che fare con il carico di lavoro e l'architettura della cache. È probabile che le cache L1 più piccole vengano replicate e ciascuna dedicata a un particolare core della CPU; le cache L2 e L3 più grandi possono essere condivise da tutti i core, anche se potenzialmente con restrizioni tali che un core CPU non affama gli altri.

Va a come il carico di lavoro specifico viene eseguito sulla specifica architettura della cache sulla macchina in questione. Quindi, suddividere i pezzi per la dimensione L3 potrebbe funzionare bene, ma i pezzi della dimensione L2 potrebbero funzionare meglio.

Una sola applicazione / carico di lavoro può accedere alla sua sezione più e più volte in modo più o meno casuale, mentre una diversa applicazione / carico di lavoro può essere eseguita solo in serie attraverso la sezione dall'inizio alla fine. Questi diversi carichi di lavoro hanno aspetti di efficienza diversi nella gerarchia della memoria, quindi suddividerli in un modo diverso potrebbe aiutare o danneggiare l'uno o l'altro carico di lavoro.

Ci sono anche misure migliori che potresti voler prendere usando vari strumenti.

    
risposta data 30.06.2017 - 00:52
fonte
3

Che strana domanda.

"Elaborazione parallela" non implica che i thread vengano eseguiti in un particolare ordine, o ad una particolare velocità di completamento, o in un lockstep per quanto riguarda i loro singoli passi, o qualcosa del genere. Non vi è alcuna garanzia sull'ordine di inizio o fine dell'esecuzione.

Se è necessario sincronizzare i thread in modo che finiscano allo stesso tempo, il modo migliore per farlo è scrivere la logica di sincronizzazione nel codice in attesa che tutti i thread finiscano prima di passare all'attività successiva. Esistono molti modi per farlo a seconda del tuo linguaggio di programmazione.

    
risposta data 30.06.2017 - 00:26
fonte
0

Ecco una risposta più semplice. Ignorando alcuni elementi di risparmio energetico (che in gran parte non saranno rilevanti in questa situazione), un core della CPU si sta esaurendo o è inattivo. Quindi, perché l'utilizzo della CPU non è sempre al 100%? Non fai sempre qualcosa? Perché un core della CPU dovrebbe essere inattivo? Un core della CPU è inattivo quando non c'è lavoro da fare. Ci sono due ragioni per cui non ci potrebbe essere lavoro da fare.

In primo luogo, non potrebbe esserci letteralmente nulla da fare. Ad esempio, se si esegue una singola istanza di un programma a thread singolo e si dispone di più core, ad esempio 2, il core che non sta eseguendo il programma non ha nulla da fare. In questo caso, l'utilizzo complessivo della CPU può essere al massimo del 50%. Questo è il motivo per cui in genere vuoi avere almeno tanti thread quanti sono i core.

In secondo luogo, e più comune, la CPU è in attesa di qualcosa. Se si desidera leggere un file ed elaborarlo, la CPU deve attendere fino a quando il file non viene letto prima di poter passare all'elaborazione. Al giorno d'oggi la lettura di un file non coinvolge principalmente la CPU, ma i dischi rigidi (compresi gli SSD) possono essere molti ordini di grandezza più lenti della CPU (a seconda degli schemi di accesso). Nel frattempo, la CPU cerca altre cose da fare. Se riesce a trovare qualcos'altro da fare, passa a quello, altrimenti è inattivo.

Quindi, un regime di utilizzo della CPU del 100%, significa che ogni volta che la CPU cerca un nuovo lavoro, lo trova. Qualcosa di meno del 100% della CPU (supponendo che abbiate almeno tanti thread come core) significa che la CPU si trova spesso nella situazione in cui tutti i thread sono bloccati in attesa di qualcosa. Tutte le altre cose uguali, qualsiasi utilizzo inferiore al 100% della CPU significa che stai sprecando cicli. In pratica, il collo di bottiglia è spesso larghezza di banda I / O o memoria. Parliamo di processi legati alla CPU, legati agli I / O e legati alla memoria. Se una di queste altre risorse è il collo di bottiglia, allora biforcarsi più thread / processi per cercare di ottenere l'utilizzo della CPU al 100% non avrà successo o non renderà il lavoro completo prima. In effetti, è probabile che sia dannoso. Se forzo due processi legati alla memoria, quando cambio tra loro, dovrò scambiare la memoria di uno per scambiare la memoria dell'altro, a quel punto la CPU rimane in attesa della memoria da scambiare Le applicazioni ad alte prestazioni in genere gestiscono attentamente la pianificazione per ottenere i migliori schemi di accesso al disco e assicurano che tutto ciò che è pertinente si adatti sempre alla memoria (e alle cache).

    
risposta data 30.06.2017 - 23:04
fonte

Leggi altre domande sui tag