Ho letto in più punti che lo scheduler predefinito di Linux è con conoscenza hyperthreading su macchine multi-core, il che significa che se si dispone di una macchina con 2 core reali (4 HT), non pianifica due thread occupati su logico core in modo che entrambi funzionino con gli stessi core fisici (il che comporterebbe in genere un aumento dei costi di 2x).Perché lo scheduler di Linux mette due thread sullo stesso core fisico sui processori con HyperThreading?
Ma quando corro stress -c 2
(genera due thread per eseguire sul 100% della CPU) sul mio Intel i5-2520M, spesso orari (e mantiene) i due fili sul core HT 1 e 2, che mappa a lo stesso nucleo fisico. Anche se il sistema è inattivo altrimenti.
Questo succede anche con i programmi reali (sto usando stress
qui perché rende facile la riproduzione), e quando ciò accade, il mio programma richiede comprensibilmente il doppio del tempo per l'esecuzione. L'impostazione manuale dell'affinità con le correzioni taskset
per il mio programma, ma mi aspetto che lo scheduler di HT consapevole lo faccia da solo.
È possibile trovare il numero HT-> nucleo fisico con egrep "processor|physical id|core id" /proc/cpuinfo | sed 's/^processor/\nprocessor/g'
.
Quindi la mia domanda è: Perché lo scheduler ha messo i miei thread sullo stesso nucleo fisico qui?
Note:
- Questa domanda è molto simile a questo other question, le cui risposte dire che Linux ha abbastanza di un sofisticato schedulatore thread che è a conoscenza HT. Come descritto sopra, non posso osservare questo fatto (controlla te stesso con
stress -c
) e vorrei sapere perché. - So che posso impostare manualmente l'affinità dei processori per i miei programmi, ad es. con lo strumento
taskset
o con la funzionesched_setaffinity
. Non è quello che sto cercando, mi aspetto che lo scheduler sappia da solo che mappare due thread occupati a un core fisico e lasciare un core fisico completamente vuoto non è una buona idea. - Sono consapevole che ci sono some situations in cui preferireste che i thread siano programmati sullo stesso core fisico e lasciano l'altro core libero, ma sembra assurdo che lo scheduler faccia circa 1/4 dei casi. Mi sembra che i core HT che seleziona siano completamente casuali, o forse quei core HT che hanno avuto meno attività al momento della pianificazione, ma che non sarebbero molto consapevoli di hyperthreading, data la chiarezza dei programmi con le caratteristiche del vantaggio
stress
da eseguire su core fisici separati.
Quali distro e la versione ti riferisci? –
Prova lo stress in esecuzione in due processi con un thread ciascuno. Non ho esaminato le specifiche dello scheduler di Linux (che potrebbe anche essere cambiato dall'ultima volta che lo stavo facendo ricerche). È possibile che il kernel preferisca pianificare i thread nello stesso processo sullo stesso processore fisico per ragioni come la localizzazione della cache. – joshperry
Ubuntu 14.04, Linux 3.13.0. – nh2