Dlaczego więcej rdzeni procesora na maszynie wirtualnej spowalnia czasy kompilacji?

17

[edytuj # 2] Jeśli ktokolwiek z VMWare może trafić do mnie z kopią VMWare Fusion, byłbym bardziej niż szczęśliwy, mogąc zrobić to samo, co porównanie VirtualBox vs VMWare. Podejrzewam, że hypervisor VMWare będzie lepiej dostrojony do hiperwątkowania (zobacz też moją odpowiedź)

Widzę coś ciekawego. Gdy zwiększam liczbę rdzeni na mojej maszynie wirtualnej z systemem Windows 7 x64, całkowity czas kompilacji zwiększa się zamiast maleć. Kompilacja jest zwykle bardzo dobrze dostosowana do przetwarzania równoległego, ponieważ w środkowej części (mapowanie zależności zależności) można po prostu wywołać instancję kompilatora w każdym pliku .c / .cpp / .cs / cokolwiek, aby zbudować częściowe obiekty do pobrania przez linker nad. Tak więc wyobrażam sobie, że kompilacja bardzo dobrze skalowałaby się z liczbą rdzeni.

Ale widzę:

  • 8 rdzeni: 1,89 sek
  • 4 rdzenie: 1,33 sek
  • 2 rdzenie: 1,24 sek
  • 1 rdzeń: 1,15 sek

Czy jest to po prostu artefakt projektowy ze względu na implementację hiperwizora określonego dostawcy (w moim przypadku typ 2: virtualbox) lub coś bardziej wszechobecnego na większej liczbie maszyn wirtualnych, aby uprościć implementacje hiperwizora? Biorąc pod uwagę tak wiele czynników, wydaje mi się, że jestem w stanie argumentować zarówno za, jak i przeciw takiemu zachowaniu - więc jeśli ktoś wie o tym więcej niż ja, chętnie przeczytam twoją odpowiedź.

Dzięki Sid

[ edycja: adresowanie komentarzy ]

@MartinBeckett: Kompilacje na zimno zostały odrzucone.

@MonsterTruck: Nie można znaleźć projektu typu open source do bezpośredniej kompilacji. Byłoby świetnie, ale nie mogę teraz spieprzyć mojego dewelopera env.

@Mr Lister, @philosodad: Mają 8 wątków, używając VirtualBox, więc powinno być mapowanie 1: 1 bez emulacji

@Thorbjorn: Mam 6,5 GB na maszynę wirtualną i niewielki projekt VS2012 - jest mało prawdopodobne, że podmieniam / wyrzucam do kosza plik stronicowania.

@Wszystkie: Jeśli ktoś może wskazać na projekt VS2010 / VS2012 typu open source, może to być lepsze odniesienie do społeczności niż mój (zastrzeżony) projekt VS2012. Wydaje się, że Orchard i DNN wymagają dostrajania środowiska w celu skompilowania w VS2012. Naprawdę chciałbym zobaczyć, czy ktoś z VMWare Fusion też to widzi (dla przedziałów VMWare vs VirtualBox)

Szczegóły testu:

  • Sprzęt: Macbook Pro Retina
    • Procesor: Core i7 @ 2.3Ghz (czterordzeniowy, hiperwątkowy = 8 rdzeni w menedżerze zadań Windows)
    • Pamięć: 16 GB
    • Dysk: 256 GB SSD
  • System operacyjny: Mac OS X 10.8
  • Typ maszyny wirtualnej: VirtualBox 4.1.18 (hypervisor typu 2)
  • System operacyjny gościa: Windows 7 x64 SP1
  • Kompilator: VS2012 kompiluje rozwiązanie z 3 projektami platformy Azure w języku C #
    • Czas kompilacji mierzony jest za pomocą wtyczki VS2012 o nazwie „VSCommands”
    • Wszystkie testy przebiegają 5 razy, pierwsze 2 są odrzucane, a ostatnie 3 uśredniane
DeepSpace101
źródło
9
Prawdopodobnie plik I / O spowalnia go z wieloma zadaniami, a dysk ma dostęp do zwirtualizowanego napędu
Martin Beckett,
3
Chciałbym to odtworzyć na własnym komputerze. Czy możesz gdzieś przesłać przykładowy projekt? Podejrzewam, że maszyna wirtualna gra tutaj sztuczki. Spróbuj uruchomić system Windows natywnie (Bootcamp) i sprawdź, czy zaobserwujesz to samo zachowanie - wątpię, że to zrobisz.
Apoorv Khurasia
1
Co tu kompilujemy? Dużo czasu narzut związany z równoległym wykonywaniem zadania nie zwraca się, dopóki nie osiągniesz określonej skali. Zobacz, jak działa kompilowanie apache lub ravendb.
Wyatt Barnett,
2
Prawdopodobnie zabrakło pamięci na maszynie wirtualnej, więc zaczyna się zamiana.
1
To samo zdarzyło mi się wcześniej z Javą używającą Maven 3.x do kompilacji na i3. Pozostawienie domyślnego wątku „4” było znacznie wolniejsze, prawie 50% wolniejsze, niż wyraźne zalecenie używania tylko 2 rdzeni. Myślę, że ma to coś wspólnego z przełączaniem kontekstu hiperwątkowości i nakładaniem się operacji we / wy.

Odpowiedzi:

12

Odpowiedź: Nie zwalnia, zwiększa się wraz z liczbą rdzeni procesora. Projekt użyty w pierwotnym pytaniu był „zbyt mały” (to właściwie mnóstwo rozwoju, ale mały / zoptymalizowany dla kompilatora), aby czerpać korzyści z wielu rdzeni. Wydaje się, że zamiast planować, jak rozłożyć pracę, odradzać wiele procesów kompilatora itp., Na tak małą skalę najlepiej jest młotkować pracę od samego początku.

Jest to oparte na nowym eksperymencie, który przeprowadziłem na podstawie komentarzy do pytania (i mojej osobistej ciekawości). Użyłem większego projektu VS - kodu źródłowego Umbraco CMS, ponieważ jest on duży, open source i można bezpośrednio załadować plik rozwiązania i przebudować (wskazówka: załaduj umbraco_675b272bb0a3\src\umbraco.slnw VS2010 / VS2012).

TERAZ, to, co widzę, jest tym, czego oczekuję, tj. Kompiluje skalowanie w górę !! Do pewnego momentu, odkąd znajduję:

Tabela wyników

Na wynos:

  • Nowy rdzeń VM powoduje powstanie nowego wątku OS X w procesie VirtualBox
  • Czasy kompilacji są skalowane zgodnie z oczekiwaniami (kompilacje są wystarczająco długie)
  • Przy 8 rdzeniach maszyn wirtualnych emulacja rdzenia może być uruchomiona w VirtualBox, ponieważ kara jest ogromna (50% trafienia)
  • Powyższe jest prawdopodobne, ponieważ OS X nie jest w stanie przedstawić 4 rdzeni hiperwątkowych (wątek 8 h / w) jako 8 rdzeni do VirtualBox

Ten ostatni punkt zmusił mnie do monitorowania historii procesora we wszystkich rdzeniach za pomocą „Activity Monitor” (historia procesora), a znalazłem

Wykres historii procesora w systemie OS X.

Na wynos:

  • Przy jednym rdzeniu VM aktywność wydaje się przeskakiwać przez 4 rdzenie HW. Ma sens, aby równomiernie rozprowadzać ciepło na podstawowych poziomach.

  • Nawet przy 4 rdzeniach wirtualnych (i 27 wątkach VirtualBox OS X lub ~ 800 wątku OS X łącznie), tylko wątki HW (0,2,4,6) są prawie nasycone, a nieparzyste wątki HW (1,3,5,7) są prawie na poziomie 0%. Bardziej prawdopodobne jest, że program planujący działa pod względem rdzeni sprzętowych, a NIE wątków sprzętowych, więc spekuluję, że 64-bitowe jądro / programista OSX nie jest zoptymalizowany pod kątem taktowania CPU? Lub patrząc na konfigurację rdzenia 8VM, być może zaczyna się od nich przy dużym obciążeniu procesora? Staje się coś śmiesznego ... to osobne pytanie dla niektórych deweloperów Darwina ...

[edytuj]: Chciałbym spróbować tego samego w VMWare Fusion. Są szanse, że nie będzie tak źle. Zastanawiam się, czy prezentują to jako produkt komercyjny

Stopka:

W przypadku, gdy obrazy kiedykolwiek znikną, zestawienie czasu kompilacji jest (tekstowe, brzydkie!)

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%
DeepSpace101
źródło
Podejrzewam, że spadek między 4 a 8 jest kombinacją VM, która nie jest zoptymalizowana pod kątem HT, a HT w żaden sposób nie jest równa dwa razy większej liczbie rdzeni (w najlepszym razie wzrost wydajności o 30%, zwykle znacznie mniej).
Daniel B
@DanielB: Przy 4 => 8 rdzeniach problemem jest nie tylko to, że jest to tylko + 30% wzrost (w porównaniu z + 100%), jak sugerowałeś - to, że wydajność wynosi w rzeczywistości -50%. Gdyby wątki sprzętowe były całkowicie „martwe / bezużyteczne”, a praca byłaby przekierowywana na inne rdzenie, delta wydajności wynosiłaby 0. Dlatego bardziej skłonny byłbym powiedzieć, że jest to projekt hiperwizora VirtualBox typu 2. Zastanawiam się, jak VMWare Fusion jest ...
DeepSpace101
„Na jednym rdzeniu maszyny wirtualnej aktywność wydaje się przeskakiwać przez 4 rdzenie HW. Sensowne jest równomierne rozprowadzanie ciepła na poziomie rdzenia” - niekoniecznie, zwykle lepiej jest ponownie zaplanować harmonogram na tym samym rdzeniu (dla pamięci podręcznej itp.) ale hiperwizor wybiera tylko Randon lub rdzeń, który jest najmniej używany, ponieważ uważa, że ​​jest to proces ogólnego przeznaczenia, w którym inne procesy wykorzystują te rdzenie. W takim przypadku optymalizacja harmonogramu działa przeciwko tobie (ale w bardzo niewielki sposób)
gbjbaanb
@Sid zgodził się, po prostu zaznaczam, że dzięki HT będziesz (znacznie) zmniejszać zwroty znacznie wcześniej, niż myślisz, jeśli zakładasz, że w rzeczywistości jest to coś w rodzaju 100% poprawy. W tym przypadku przyczyną może być spór o HD, stąd moja wcześniejsza sugestia dotycząca niektórych sztucznych testów wydajności procesora.
Daniel B
6

Jest tylko jeden możliwy powód, dla którego tak się dzieje, a mianowicie to, że koszty ogólne przekraczają zyski.

Być może emulujesz wiele rdzeni, zamiast przypisywać rzeczywiste rdzenie, a nawet procesy, a nawet wątki z komputera hosta. Wydaje mi się to całkiem prawdopodobne i oczywiście da ci przyspieszenie ujemne.

Inną możliwością jest to, że sam proces nie jest dobrze zrównoleglony, a nawet próba zrównoleglenia kosztuje cię więcej narzutów w komunikacji niż zyskujesz.

filozofodad
źródło
your overhead is exceeding your gains: To prawda, ale w zasadzie obejmuje wszystko, nie wiedząc, co tak naprawdę powoduje :) ... Używam VirtualBox i mam fizyczne rdzenie, więc zakładam, że mapowanie powinno być 1: 1 bez emulacji. Mam zamiar wyszukać DUŻE oprogramowanie open source VS2012, aby inni też mogli się nim odwołać ... brb
DeepSpace101
@Sid zgodnie z tą odpowiedzią superuser.com/a/297727 maszyna wirtualna virtualbox powinna odpowiednio używać rdzeni hosta. Ale nadal sprawdzam, co się dzieje na hoście, aby upewnić się, że wystąpi oczekiwane zachowanie.
philosodad
0

Nie jesteś sam ...

To samo zdarzyło mi się wcześniej z Javą używającą Maven 3.x do kompilacji na i3. Pozostawienie domyślnego wątku „4” było znacznie wolniejsze, prawie 50% wolniejsze, niż wyraźne zalecenie używania tylko 2 rdzeni.

Myślę, że ma to coś wspólnego z przełączaniem kontekstu hiperwątkowości i nakładaniem się we / wy.

Ma to sens, gdy zaczynasz o tym myśleć. Możesz udowodnić, co powoduje degenerację wyników za pomocą dobrego narzędzia do profilowania całego systemu.


źródło