Sanal makinede daha fazla CPU çekirdeği derleme sürelerini neden yavaşlatır?


17

VMWare'den herhangi biri VMWare Fusion'ın bir kopyasıyla beni vurabilirse, VirtualBox vs VMWare karşılaştırmasıyla aynı şeyi yapmaktan mutluluk duyarım. Her nasılsa VMWare hipervizörünün hiper iş parçacığı için daha iyi ayarlanacağından şüpheleniyorum (ayrıca cevabımı da görün)

Meraklı bir şey görüyorum. Windows 7 x64 sanal makinemdeki çekirdek sayısını artırdığımda, derleme süresi azalmak yerine artıyor . Derleme genellikle orta kısımdaki (post bağımlılık eşlemesi) paralel işleme için çok uygundur. Bağlayıcının alması için kısmi nesneler oluşturmak için .c / .cpp / .cs / herhangi bir dosyanızın her birinde bir derleyici örneği çağırabilirsiniz. bitmiş. Yani derlemenin aslında çekirdek sayısı ile çok iyi ölçeklendiğini hayal ederdim.

Ama gördüğüm şey:

  • 8 çekirdek: 1.89 sn
  • 4 çekirdek: 1.33 sn
  • 2 çekirdek: 1.24 sn
  • 1 çekirdek: 1.15 sn

Bu sadece belirli bir satıcının hipervizör uygulamasından (benim durumumda tip2: sanal kutu) veya hipervizör uygulamalarını daha basit hale getirmek için daha fazla VM'de daha yaygın bir şeyden dolayı bir tasarım eseri mi? Pek çok faktörle, bu davranış için hem bu davranışa karşı hem de ona karşı argümanlar yapabiliyorum gibi görünüyor - bu yüzden birisi benden daha fazla şey biliyorsa, cevabınızı okumak isterim.

Teşekkürler Sid

[ değiştir: yorumları adresleme ]

@MartinBeckett: Soğuk derlemeler atıldı.

@MonsterTruck: Doğrudan derlenecek bir açık kaynak projesi bulunamadı. Harika olurdu ama şu anda dev env'imi mahvedemiyorum.

@Mr Lister, @philosodad: VirtualBox kullanarak 8 saat konu var, öykünme olmadan 1: 1 eşleme olmalı

@Thorbjorn: VM ve ufacık bir VS2012 projesi için 6.5GB'ım var - sayfa dosyasını çöpe atmak / çıkarmak çok olası değil.

@Tüm: Birisi açık kaynaklı bir VS2010 / VS2012 projesine işaret edebilirse, bu benim (tescilli) VS2012 projemden daha iyi bir topluluk referansı olabilir. Orchard ve DNN'nin VS2012'de derlenmesi için çevre düzenlemesi yapılması gerekiyor gibi görünüyor. VMWare Fusion'a sahip birinin de bunu görüp görmediğini görmek istiyorum (VMWare vs VirtualBox bölümlendirme için)

Test ayrıntıları:

  • Donanım: Macbook Pro Retina
    • CPU: Core i7 @ 2.3Ghz (dört çekirdekli, hiper iş parçacıklı = Windows görev yöneticisinde 8 çekirdek)
    • Bellek: 16 GB
    • Disk: 256 GB SSD
  • Ana İşletim Sistemi: Mac OS X 10.8
  • VM türü: VirtualBox 4.1.18 (tip 2 hipervizör)
  • Konuk İşletim Sistemi: Windows 7 x64 SP1
  • Derleyici: VS2012, 3 C # Azure projesiyle bir çözüm derliyor
    • Derleme süreleri 'VSCommands' adlı VS2012 eklentisi tarafından ölçülür
    • Tüm testler 5 kez yapılır, ilk 2 işlem atılır, son 3 ortalama

9
Muhtemelen I / O dosyası birden çok görevle yavaşlatıyor ve sanallaştırılmış sürücüye disk erişimi var
Martin Beckett

3
Bunu kendi makinemde çoğaltmak istiyorum. Lütfen bir yere örnek bir proje yükleyebilir misiniz? Sanal makinenin burada hile yaptığından şüpheleniyorum. Windows'a yerel olarak önyükleme yapmayı deneyin (Bootcamp) ve aynı davranışı gözlemleyip gözlemlemediğinizi görün - Eminim.
Apoorv Khurasia

1
Burada ne derliyoruz? Bir görevi paralel hale getirme yükü, belirli bir ölçeğe ulaşana kadar pek fazla zaman ödemez. Apache veya ravendb derlemenin nasıl yapıldığını görün.
Wyatt Barnett

2
Muhtemelen sanal makinenizde bellek kalmaz, böylece değişmeye başlar.

1
Aynı şey daha önce Java ile bir i3 üzerinde derlemek için Maven 3.x kullanarak oldu. Varsayılan olarak "4" iş parçacığı için izin vermek, yalnızca 2 çekirdek kullanmasını açıkça söylemekten çok daha yavaş,% 50'ye yakın daha yavaştı. Bence hiper iş parçacığı bağlam değiştirme ve çakışan I / O ile ilgili bir şey olduğunu düşünüyorum.

Yanıtlar:


12

Cevap: Yavaşlamıyor, # CPU çekirdeği ile ölçekleniyor. Orijinal soruda kullanılan proje , birden fazla çekirdeğin faydalarını elde etmek için 'çok küçük' (aslında bir ton geliştirme ama küçük / bir derleyici için optimize edildi). İşin nasıl yayılacağını planlamak yerine, birden fazla derleyici işleminin ortaya çıkması vb.

Bu, soruya yapılan yorumları (ve kişisel merakımı) temel alarak yaptığım yeni denemeye dayanıyor. Daha büyük bir VS projesi kullandım - Umbraco CMS's kaynak kodu büyük, açık kaynaklı ve doğrudan çözüm dosyasını yükleyebilir ve yeniden oluşturabilir (ipucu: umbraco_675b272bb0a3\src\umbraco.slnVS2010 / VS2012'de yükleyin).

ŞİMDİ, gördüğüm şey beklediğim, yani ölçekler derler !!Bulduğumdan beri belli bir noktaya kadar:

Sonuç tablosu

çıkarımlar:

  • Yeni bir VM çekirdeği, VirtualBox işlemi içinde yeni bir OS X İş Parçacığı oluşturur
  • Derleme süreleri beklendiği gibi ölçeklenir (derlemeler yeterince uzun)
  • 8 VM çekirdeğinde, çekirdek emülasyonu, ceza büyük olduğu için VirtualBox'ın içine giriyor olabilir (% 50 vuruş)
  • OS X'in VirtualBox'a 8 çekirdek olarak 4 hiper iş parçacıklı çekirdek (8 s / w iş parçacığı) sunamaması nedeniyle yukarıda belirtilenler olabilir

Bu son nokta, 'Etkinlik Monitörü' (CPU geçmişi) aracılığıyla tüm çekirdeklerdeki CPU geçmişini izlememe neden oldu ve

OS X CPU geçmiş grafiği

çıkarımlar:

  • Bir VM çekirdeğinde, etkinlik 4 HW çekirdeği boyunca atlıyor gibi görünüyor. Isıyı çekirdek seviyelerinde eşit olarak dağıtmak mantıklıdır.

  • 4 Sanal çekirdekte (ve 27 VirtualBox OS X iş parçacığı veya genel olarak ~ 800 OS X iş parçacığı) bile, yalnızca HW iş parçacıkları (0,2,4,6) neredeyse doygunken, tek HW iş parçacıkları (1,3,5,7) neredeyse% 0 seviyesinde. Büyük olasılıkla zamanlayıcı HW çekirdekler ve NOT HW iş parçacıkları açısından çalışır, bu yüzden belki de OSX 64bit çekirdek / zamanlayıcı hiper dişli CPU için optimize değil? Ya da 8VM çekirdek kurulumuna baktığımızda, belki de onları yüksek bir CPU kullanımında kullanmaya başlar? Komik bir şey olacak ... şey, bu bazı Darwin geliştiricileri için ayrı bir soru ...

Aynı şeyi VMWare Fusion'da denemek isterim. Muhtemelen bu kadar kötü olmayacak. Bunu ticari bir ürün olarak gösterip göstermediklerini merak ediyorum ...

Altbilgi:

Görüntülerin kaybolması durumunda, derleme zamanı tablosu (metin, çirkin!)

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%

4 ve 8 arasındaki düşüşün VM'nin HT için optimize edilmediğinden ve HT'nin hiçbir şekilde iki çekirdeğin iki katına eşit olmadığından (en iyi ihtimalle % 30 performans artışı, genellikle çok daha az) bir kombinasyon olduğundan şüpheleniyorum .
Daniel B

@DanielB: 4 => 8 çekirdekte, sorun sadece önerdiğiniz gibi +% 30'luk bir artış (+% 100'e kıyasla) değil - performansın aslında% -50 olması. Donanım iş parçacıkları tamamen 'ölü / işe yaramazsa ve iş diğer çekirdeklere yönlendiriliyorsa, performans deltası 0 olur. Bu nedenle bunun VirtualBox tip 2 hipervizöründeki tasarım olduğunu söylemeye daha meyilli olurdum. VMWare Fusion'ın nasıl olduğunu merak ediyorum ...
DeepSpace101

"Bir VM çekirdeğinde, etkinlik 4 HW çekirdeği boyunca atlıyor gibi görünüyor. Isıyı çekirdek seviyelerinde eşit olarak dağıtmak mantıklıdır" - zorunlu olarak, aynı çekirdek üzerinde (önbellek vb.) Yeniden programlamak genellikle daha iyidir ancak hipervizör sadece randonda bir tane veya en az kullanılan çekirdeği seçiyor çünkü diğer işlemlerin bu çekirdekleri kullandığı genel amaçlı bir işlem olduğunu düşünüyor. Bu durumda, zamanlayıcı optimizasyonu size karşı çalışır (ancak çok küçük bir şekilde)
gbjbaanb 13:12

@Sid kabul etti, sadece HT ile azalan geri dönüşleri düşündüğünüzden çok daha erken alacağınıza işaret ediyorum, eğer aslında% 100 iyileşme gibi bir şey varsayalım. Bu durumda, HD'niz için buna neden olan çekişme olabilir, bu nedenle bazı yapay CPU karşılaştırmaları için önceki önerim.
Daniel B

6

Bunun olmasının tek bir nedeni var, bu da ek yükünüzün kazancınızı aşıyor olması.

Ana makineden gerçek çekirdekler, hatta işlemler ve hatta iplikler atamak yerine birden fazla çekirdeği taklit ediyor olabilirsiniz. Bu benim için oldukça muhtemel görünüyor ve açıkçası size olumsuz bir hız verecek.

Diğer olasılık, sürecin kendisinin iyi paralellik göstermemesi ve paralelleştirmeye çalışmak bile iletişim yükünde kazandığınızdan daha pahalıya mal oluyor.


your overhead is exceeding your gains: Doğru ama bu gerçekten neyin neden olduğunu bilmeden hemen hemen her şeyi kapsar :) ... VirtualBox kullanıyorum ve fiziksel çekirdekler var, bu yüzden eşleme öykünme olmadan 1: 1 olması gerekiyordu. Başkaları da başvurabilirsiniz BÜYÜK açık kaynak VS2012 arayacağım ... brb
DeepSpace101

@ Bu cevap superuser.com/a/297727 uyarınca sanal kutu VM, ana bilgisayar çekirdeklerini uygun şekilde kullanmalıdır. Ancak yine de, beklenen davranışın gerçekleştiğinden emin olmak için ana bilgisayarda neler olup bittiğini kontrol ederim.
philosodad

0

Yalnız değilsin ...

Aynı şey daha önce de Java ile bir i3 üzerinde derlemek için Maven 3.x kullanarak oldu. Varsayılan olarak "4" iş parçacığı için izin vermek, yalnızca 2 çekirdek kullanmasını açıkça söylemekten çok daha yavaş,% 50'ye yakın daha yavaştı.

Bence hiper iş parçacığı bağlam değiştirme ve çakışan I / O ile ilgili bir şey olduğunu düşünüyorum.

Bunu düşünmeye başladığınızda mantıklı. İyi bir sistem çapındaki profil oluşturma aracıyla sonuçların bozulmasına neyin sebep olduğunu kanıtlayabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.