Perché più core CPU sulla macchina virtuale rallentano i tempi di compilazione?

16

[modifica n. 2] Se qualcuno di VMWare può trovarmi con una copia di VMWare Fusion, sarei più che felice di fare lo stesso di un confronto tra VirtualBox e VMWare. In qualche modo sospetto che l'hypervisor VMWare sarà meglio sintonizzato per l'hyperthreading (vedi anche la mia risposta)

Vedo qualcosa di curioso. Aumentando il numero di core sulla mia macchina virtuale Windows 7 x64, il tempo di compilazione complessivo aumenta invece di diminuire. La compilazione di solito è molto adatta per l'elaborazione parallela poiché nella parte centrale (mappatura post dipendenza) puoi semplicemente chiamare un'istanza del compilatore su ciascuno dei tuoi file .c / .cpp / .cs / qualunque per creare oggetti parziali da utilizzare per il linker al di sopra di. Quindi avrei immaginato che la compilazione sarebbe effettivamente in scala molto bene con # di core.

Ma quello che sto vedendo è:

  • 8 core: 1.89 secondi
  • 4 core: 1.33 secondi
  • 2 core: 1,24 secondi
  • 1 core: 1,15 sec

Si tratta semplicemente di un artefatto di progettazione a causa dell'implementazione di un hypervisor di un particolare fornitore (tipo2: virtualbox nel mio caso) o qualcosa di più pervasivo su più VM per rendere le implementazioni hypervisor più semplici? Con così tanti fattori, mi sembra di essere in grado di argomentare sia a favore che contro questo comportamento, quindi se qualcuno ne sapesse di più di me, sarei curioso di leggere la tua risposta.

Grazie Sid

[ modifica: commenti agli indirizzi ]

@MartinBeckett: le compilazioni a freddo sono state scartate.

@MonsterTruck: impossibile trovare un progetto opensource da compilare direttamente. Sarebbe bello ma non può rovinare il mio dev env adesso.

@Mr Lister, @philosodad: hanno 8 thread hw, usando VirtualBox, quindi dovrebbe essere mappatura 1: 1 senza emulazione

@Thorbjorn: ho 6,5 GB per la VM e un progetto VS2012 di dimensioni ridotte - è piuttosto improbabile che io stia invertendo / eliminando il file di paging.

@All: se qualcuno può puntare a un progetto VS2010 / VS2012 open source, questo potrebbe essere un riferimento comunitario migliore del mio progetto (proprietario) VS2012. Orchard e DNN sembrano aver bisogno di un tweak di ambiente da compilare in VS2012. Mi piacerebbe davvero vedere se anche qualcuno con VMWare Fusion lo vede (per la compartimentazione VMWare vs VirtualBox)

Dettagli del test:

  • Hardware: Macbook Pro Retina
    • CPU: Core i7 @ 2.3Ghz (quad core, hyper threaded = 8 core nel task manager di Windows)
    • Memoria: 16 GB
    • Disco: SSD da 256 GB
  • Sistema operativo host: Mac OS X 10.8
  • Tipo di macchina virtuale: VirtualBox 4.1.18 (hypervisor di tipo 2)
  • Sistema operativo guest: Windows 7 x64 SP1
  • Compilatore: VS2012 che compila una soluzione con 3 progetti C # Azure
    • Misura tempi di compilazione tramite il plugin VS2012 chiamato "VSCommands"
    • Tutti i test vengono eseguiti 5 volte, le prime 2 vengono eliminate, le ultime 3 medie
posta DeepSpace101 11.08.2012 - 06:24
fonte

3 risposte

11

Risposta: Non rallenta, si scala con # di core CPU. Il progetto utilizzato nella domanda originale era "troppo piccolo" (in realtà è un ton di sviluppo ma piccolo / ottimizzato per un compilatore) per sfruttare i vantaggi di più core. Sembra invece di pianificare come distribuire il lavoro, generare più processi del compilatore, ecc., Su questa piccola scala è meglio martellare seriamente il lavoro immediatamente.

Questo è basato sul nuovo esperimento che ho fatto basandomi sui commenti alla domanda (e sulla mia curiosità personale). Ho usato un progetto VS più grande - il codice sorgente di Umbraco CMS poiché è grande, open source e si può caricare direttamente il file di soluzione e ricostruzione (suggerimento: caricare umbraco_675b272bb0a3\src\umbraco.sln in VS2010 / VS2012).

ADESSO, quello che vedo è quello che mi aspetto, cioè compila la scala !! Beh, ad un certo punto da quando ho trovato:

asporto:

  • UnnuovonucleoVMgeneraunnuovothreadOSXall'internodelprocessoVirtualBox
  • Itempidicompilazioneaumentanocomeprevisto(lecompilazionisonosufficienti)
  • A8coreVM,l'emulazionedibasepotrebbeessereavviataall'internodiVirtualBoxpoichélapenalitàèmassiccia(50%dihit)
  • QuantosopraèprobabileperchéOSXnonèingradodipresentare4coreiper-threaded(thread8h/w)come8coreinVirtualBox

L'ultimopuntomihaindottoamonitorarelacronologiadellaCPUsututtiicoretramite"Activity Monitor" (cronologia della CPU) e ciò che ho trovato è stato

asporto:

  • In una VM core, l'attività sembra saltellare tra i 4 core HW. Ha senso, distribuire uniformemente il calore ai livelli centrali.

  • Anche a 4 core virtuali (e 27 thread VirtualBox OS X o ~ 800 thread OS X complessivi), solo i thread HW (0,2,4,6) sono quasi saturi mentre i thread HW dispari (1, 3,5,7) sono quasi allo 0%. Più probabilmente lo schedulatore funziona in termini di core HW e thread NON HW, quindi suppongo che il kernel / schedulatore OSX a 64 bit non sia ottimizzato per la CPU con hyper thread? O guardando l'installazione del core 8VM, forse inizia a usarli con un elevato utilizzo della CPU%? Qualcosa di divertente ne sta andando uno ... beh, questa è una domanda separata per alcuni sviluppatori di Darwin ...

[modifica]: mi piacerebbe provare lo stesso in VMWare Fusion. È probabile che non sarà così male. Mi chiedo se mostrino questo come un prodotto commerciale ...

Piè di pagina:

Nel caso in cui le immagini scompaiano, la tabella di compilazione è (testo, brutto!)

Cores in    Avg compile      Host/OSX    Host/OSX CPU
   VM         times (sec)   Threads      consumption
    1           11.83            24        105-115%
    2           10.04            25        140-190%
    4            9.59            27        180-270%
    8           14.18            31        240-430%
    
risposta data 13.08.2012 - 04:35
fonte
6

C'è solo una possibile ragione per questo che sta accadendo, che è che il tuo overhead sta superando i tuoi guadagni.

È possibile emulare i nuclei multipli, anziché assegnare core effettivi o persino processi o persino thread dalla macchina host. Mi sembra piuttosto probabile, e ovviamente ti darà un aumento di velocità negativo.

L'altra possibilità è che il processo stesso non è in parallelo, e anche il tentativo di parallelizzarlo ti sta costando più del sovraccarico di comunicazione di quello che stai guadagnando.

    
risposta data 11.08.2012 - 17:01
fonte
0

Non sei solo ...

La stessa cosa mi è successa prima con Java usando Maven 3.x per compilare su un i3. Lasciarlo in modo predefinito su "4" i thread era molto più lento, vicino al 50% più lento, piuttosto che dirlo esplicitamente per usare solo 2 core.

Penso che abbia qualcosa a che fare con il cambio di contesto hyper-threading e l'I / O che si sovrappone.

Ha senso quando inizi a pensarci. Puoi provare che cosa causa la degenerazione dei risultati con un buon strumento di profilazione del sistema.

    
risposta data 11.08.2012 - 20:51
fonte