เหตุใดแกนประมวลผล CPU เพิ่มเติมบนเครื่องเสมือนจึงรวมเวลาช้าลง


17

[แก้ไข # 2] ถ้าใครจาก VMWare สามารถตีฉันด้วยสำเนาของ VMWare Fusion ฉันยินดีที่จะทำเช่นเดียวกันกับการเปรียบเทียบ VirtualBox กับ VMware อย่างใดฉันสงสัยว่า hypervisor VMware จะได้รับการปรับให้ดีขึ้นสำหรับการทำไฮเปอร์เธรด (ดูคำตอบของฉันด้วย)

ฉันเห็นสิ่งที่อยากรู้ เมื่อฉันเพิ่มจำนวนคอร์ในเครื่องเสมือน Windows 7 x64 ของฉันเวลาในการรวบรวมโดยรวมจะเพิ่มขึ้นแทนที่จะลดลง การคอมไพล์มักจะเหมาะอย่างยิ่งสำหรับการประมวลผลแบบขนานเช่นเดียวกับในส่วนตรงกลาง (การทำแผนที่การพึ่งพาโพสต์) คุณสามารถเรียกอินสแตนซ์คอมไพเลอร์ในแต่ละไฟล์. c / .cpp / .cs / ไฟล์ใดก็ได้เพื่อสร้างวัตถุบางส่วน เกิน. ดังนั้นฉันจะจินตนาการว่าการคอมไพล์จริง ๆ แล้วจะขยายขนาดได้ดีกับ # ของแกนประมวลผล

แต่สิ่งที่ฉันเห็นคือ:

  • 8 คอร์: 1.89 วินาที
  • 4 แกน: 1.33 วินาที
  • 2 คอร์: 1.24 วินาที
  • 1 แกน: 1.15 วินาที

นี่เป็นเพียงการออกแบบสิ่งประดิษฐ์เนื่องจากการใช้งานไฮเปอร์ไวเซอร์ของผู้ขายโดยเฉพาะ (type2: virtualbox ในกรณีของฉัน) หรือบางสิ่งที่แพร่หลายทั่วทั้ง VMs มากขึ้นเพื่อทำให้การใช้ไฮเปอร์ไวเซอร์ง่ายขึ้น? ด้วยปัจจัยหลายอย่างฉันดูเหมือนจะสามารถโต้เถียงทั้งกับและต่อต้านพฤติกรรมนี้ - ดังนั้นถ้ามีคนรู้เรื่องนี้มากกว่าฉันฉันอยากรู้อยากเห็นที่จะอ่านคำตอบของคุณ

ขอบคุณซิด

[ แก้ไข: ความคิดเห็นที่อยู่ ]

@MartinBeckett: คอมไพล์เย็นถูกยกเลิก

@MonsterTruck: ไม่พบโครงการ opensource เพื่อรวบรวมโดยตรง คงจะดีมาก แต่ไม่สามารถทำให้สำเร็จ dev env ของฉันได้ในขณะนี้

@Mr Lister, @philosodad: มี 8 hw เธรดโดยใช้ VirtualBox ดังนั้นควรทำการแมป 1: 1 โดยไม่มีการจำลอง

@Thorbjorn: ฉันมี 6.5GB สำหรับ VM และโครงการ VS2012 ขนาดเล็ก - มันค่อนข้างไม่น่าที่ฉันจะสลับเข้า / ออกเพื่อทำลายไฟล์หน้า

@ ทั้งหมด: หากมีคนสามารถชี้ไปที่โครงการ VS2010 / VS2012 แบบโอเพ่นซอร์สนั่นอาจเป็นการอ้างอิงชุมชนที่ดีกว่าโครงการ VS2012 ของฉัน (กรรมสิทธิ์) Orchard และ DNN ต้องการสภาพแวดล้อมที่ปรับเปลี่ยนเพื่อรวบรวมใน VS2012 ฉันอยากจะดูว่าคนที่มี VMWare Fusion เห็นด้วยหรือไม่ (สำหรับ VMWare vs VirtualBox compartmentalization)

รายละเอียดการทดสอบ:

  • ฮาร์ดแวร์: Macbook Pro Retina
    • CPU: Core i7 @ 2.3Ghz (Quad Core, ไฮเปอร์เธรด = 8 แกนในตัวจัดการงานของ windows)
    • หน่วยความจำ: 16 GB
    • ดิสก์: 256GB SSD
  • โฮสต์ระบบปฏิบัติการ: Mac OS X 10.8
  • ประเภท VM: VirtualBox 4.1.18 (ประเภทที่ 2 ไฮเปอร์ไวเซอร์)
  • ระบบปฏิบัติการทั่วไป: Windows 7 x64 SP1
  • คอมไพเลอร์: VS2012 รวบรวมโซลูชันด้วย 3 C # Azure โปรเจ็กต์
    • รวบรวมเวลาวัดโดยปลั๊กอิน VS2012 ที่เรียกว่า 'VSCommands'
    • การทดสอบทั้งหมดรัน 5 ครั้ง, 2 ครั้งแรกถูกทิ้ง, 3 ค่าเฉลี่ยล่าสุด

9
อาจเป็นไปได้ว่าไฟล์ I / O จะชะลอตัวลงด้วยงานทวีคูณและการเข้าถึงแผ่นดิสก์ไปยังไดรฟ์เสมือนจริง
Martin Beckett

3
ฉันต้องการทำซ้ำในเครื่องของฉันเอง คุณช่วยอัพโหลดโครงการตัวอย่างที่อื่นได้ไหม ฉันสงสัยว่าเครื่องเสมือนกำลังเล่นเทคนิคที่นี่ ลองทำการบูทไปที่ Windows (Bootcamp) และดูว่าคุณสังเกตเห็นพฤติกรรมแบบเดียวกันหรือไม่ - ฉันสงสัยว่าคุณจะทำหรือไม่
Apoorv Khurasia

1
เรากำลังรวบรวมอะไรที่นี่? มีเวลามากมายที่ค่าใช้จ่ายในการทำขนานจะไม่จ่ายจนกว่าคุณจะถึงระดับที่แน่นอน ดูวิธีการรวบรวม apache หรือ ravendb
ไวแอตต์บาร์เน็ตต์

2
คุณอาจมีหน่วยความจำไม่เพียงพอในเครื่องเสมือนของคุณดังนั้นจึงเริ่มทำการแลกเปลี่ยน

1
สิ่งเดียวกันเกิดขึ้นกับฉันก่อนหน้านี้ด้วย Java โดยใช้ Maven 3.x เพื่อคอมไพล์ใน i3 การปล่อยให้เป็นค่าเริ่มต้นสำหรับเธรด"4"นั้นช้ากว่ามากใกล้ 50% ช้ากว่าบอกไว้ชัดเจนว่าใช้ 2 คอร์เท่านั้น ฉันคิดว่ามีบางอย่างเกี่ยวข้องกับการสลับบริบทแบบไฮเปอร์เธรดและการทับซ้อน I / O

คำตอบ:


12

คำตอบ: ไม่ช้าลงมันเพิ่มขนาดด้วยจำนวนแกน CPU โครงการที่ใช้ในคำถามเดิมคือ 'เล็กเกินไป (ก็จริงตันของการพัฒนา แต่ / ขนาดเล็กเหมาะสำหรับการคอมไพเลอร์) เพื่อเก็บเกี่ยวผลประโยชน์ของแกนหลาย ดูเหมือนว่าแทนที่จะวางแผนวิธีกระจายงานวางไข่กระบวนการคอมไพเลอร์หลาย ๆ แบบ ฯลฯ ในขนาดเล็กนี้ควรใช้ค้อนทุบที่งานทันทีจากค้างคาว

นี่เป็นพื้นฐานของการทดสอบใหม่ที่ฉันทำตามความเห็นของคำถาม (และความอยากรู้ส่วนตัวของฉัน) ฉันใช้โครงการ VS ที่ใหญ่กว่า - ซอร์สโค้ดของ Umbraco CMS เนื่องจากมีขนาดใหญ่เปิดแหล่งที่มาและสามารถโหลดไฟล์โซลูชันและสร้างใหม่ได้โดยตรง (คำแนะนำ: โหลดumbraco_675b272bb0a3\src\umbraco.slnใน VS2010 / VS2012)

ตอนนี้สิ่งที่ฉันเห็นคือสิ่งที่ฉันคาดหวังเช่นรวบรวมขนาดขึ้น !! ถึงจุดหนึ่งตั้งแต่ฉันพบ:

ตารางผลลัพธ์

ประเด็น:

  • VM core ใหม่ส่งผลให้เกิด OS X Thread ใหม่ภายในกระบวนการ VirtualBox
  • เวลาคอมไพล์เพิ่มขึ้นตามที่คาดไว้ (คอมไพล์ยาวพอ)
  • ที่ 8 คอร์ VM การจำลองหลักอาจเตะเข้าใน VirtualBox เนื่องจากการลงโทษมีขนาดใหญ่มาก (ยอดฮิต 50%)
  • อาจเป็นไปได้เพราะ OS X ไม่สามารถแสดงคอร์ไฮเปอร์เธรด 4 คอร์ (เธรด 8 h / w) เป็น 8 คอร์ไปยัง VirtualBox

จุดสุดท้ายที่ทำให้ฉันตรวจสอบประวัติ CPU ในทุกแกนผ่าน 'กิจกรรมการตรวจสอบ' (ประวัติ CPU) และสิ่งที่ฉันพบคือ

กราฟประวัติ CPU OS X

ประเด็น:

  • ที่หนึ่งคอร์ VM กิจกรรมดูเหมือนจะกระโดดข้ามคอร์ HW 4 แกน เหมาะสมสำหรับการกระจายความร้อนอย่างสม่ำเสมอในระดับแกนกลาง

  • แม้จะอยู่ที่ 4 คอร์เสมือน (และ 27 เธรด VirtualBox OS X หรือรวมเธรด ~ 800 OS X) แม้กระทั่งเธรด HW (0,2,4,6) จะอิ่มตัวเกือบในขณะที่เธรด HW แปลก ๆ (1,3,5,7) เกือบจะอยู่ที่ 0% มีโอกาสมากที่ตัวกำหนดตารางเวลาจะทำงานในแง่ของ HW cores และไม่ใช่เธรด HW ดังนั้นฉันจึงคาดการณ์ว่า OSX 64 บิตเคอร์เนล / ตัวจัดตารางเวลาไม่ได้รับการปรับให้เหมาะสมสำหรับซีพียูแบบเธรดไฮเปอร์? หรือดูที่การตั้งค่าคอร์ 8VM บางทีมันเริ่มใช้พวกมันที่การใช้งาน CPU สูงหรือไม่ บางสิ่งที่ตลกกำลังจะเข้ากัน ... เอาละนี่เป็นคำถามแยกต่างหากสำหรับนักพัฒนาบางคนของดาร์วิน ...

[แก้ไข]: ฉันชอบที่จะลองเหมือนกันใน VMWare Fusion โอกาสที่มันจะไม่เลวร้ายแบบนี้ ฉันสงสัยว่าพวกเขาแสดงเป็นผลิตภัณฑ์เชิงพาณิชย์หรือไม่

ส่วนท้าย:

ในกรณีที่ภาพหายไปตารางเวลาการคอมไพล์คือ (ข้อความน่าเกลียด!)

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 และ 8 เป็นการรวมกันของ VM ที่ไม่ได้รับการปรับให้เหมาะสมสำหรับ HT และ HT ไม่ได้มีค่าเท่ากับสองเท่าของแกนประมวลผล (ที่ดีที่สุดเพิ่มประสิทธิภาพ 30% ซึ่งมักจะน้อยกว่า)
Daniel B

@DanielB: ที่ 4 => 8 แกนไม่ใช่แค่ว่ามันเป็นเพียงการเพิ่ม + 30% (เทียบกับ + 100%) ตามที่คุณแนะนำ - มันคือประสิทธิภาพจริง ๆ แล้ว -50% หากเธรดฮาร์ดแวร์ทั้งหมด 'ไร้ประโยชน์ / ไร้ประโยชน์' และงานถูกเบี่ยงเบนไปจากคอร์อื่น ๆ เดลต้าประสิทธิภาพจะเป็น 0 ดังนั้นฉันจึงมีแนวโน้มที่จะบอกว่ามันคือการออกแบบบนไฮเปอร์ไวเซอร์ VirtualBox ประเภท 2 ฉันสงสัยว่า VMWare Fusion นั้นเป็นอย่างไร ...
DeepSpace101

"ที่หนึ่งคอร์ VM กิจกรรมดูเหมือนว่าจะกระโดดข้าม 4 คอร์ HW ทำให้รู้สึกเพื่อกระจายความร้อนอย่างสม่ำเสมอในระดับแกนกลาง" - ไม่จำเป็นต้องปกติแล้วมันจะดีกว่าที่จะกำหนดตารางเวลาบนแกนเดียวกันอีกครั้ง (สำหรับแคช ฯลฯ ) แต่ไฮเปอร์ไวเซอร์นั้นเลือกเพียงหนึ่งตัวที่ randon หรือแกนที่ใช้น้อยที่สุดเพราะมันคิดว่าเป็นการประมวลผลทั่วไปที่กระบวนการอื่น ๆ กำลังใช้แกนประมวลผลเหล่านั้น ในกรณีนี้การเพิ่มประสิทธิภาพการจัดตารางเวลาทำงานกับคุณ ( แต่ในทางที่น้อยมาก)
gbjbaanb

@Sid เห็นด้วยฉันแค่ชี้ให้เห็นว่าด้วย HT ที่คุณจะได้รับ (มาก) การลดลงจะได้ผลตอบแทนเร็วกว่าที่คุณคิดถ้าคุณคิดว่ามันเป็นการปรับปรุงที่ 100% ในกรณีนี้มันอาจเป็นการโต้แย้งสำหรับ HD ของคุณที่เป็นสาเหตุของเรื่องนี้ดังนั้นข้อเสนอแนะก่อนหน้านี้ของฉันสำหรับการวัดประสิทธิภาพ CPU เทียม
Daniel B

6

มีเหตุผลเดียวที่เป็นไปได้สำหรับสิ่งนี้ที่จะเกิดขึ้นซึ่งก็คือค่าใช้จ่ายของคุณเกินผลกำไรของคุณ

คุณอาจเลียนแบบหลายคอร์แทนที่จะกำหนดคอร์จริงหรือแม้กระทั่งกระบวนการหรือแม้กระทั่งเธรดจากเครื่องโฮสต์ ดูเหมือนว่าจะเป็นไปได้สำหรับฉันและเห็นได้ชัดว่าจะเพิ่มความเร็วเชิงลบให้คุณ

ความเป็นไปได้อีกอย่างก็คือกระบวนการเองนั้นไม่ได้ขนานกันอย่างดีและแม้แต่การพยายามที่จะขนานมันก็จะทำให้คุณเสียค่าใช้จ่ายในการติดต่อสื่อสารมากกว่าที่คุณได้รับ


your overhead is exceeding your gains: จริง แต่นั่นก็ครอบคลุมทุกอย่างโดยไม่รู้ว่าอะไรเป็นสาเหตุของมัน :) ... ฉันกำลังใช้ VirtualBox และมีแกนกลางทางกายภาพดังนั้นการทำแผนที่ควรเป็น 1: 1 โดยไม่มีการจำลอง ฉันจะค้นหา VS2012 โอเพ่นซอร์สขนาดใหญ่เพื่อให้ผู้อื่นสามารถอ้างอิงได้เช่นกัน ...
brb

@Sid ตามคำตอบนี้superuser.com/a/297727 virtualbox VM ควรใช้โฮสต์หลักอย่างเหมาะสม แต่ฉันยังคงตรวจสอบสิ่งที่เกิดขึ้นในโฮสต์เพื่อให้แน่ใจว่าพฤติกรรมที่คาดว่าจะเกิดขึ้น
philosodad

0

คุณไม่ได้อยู่คนเดียว ...

สิ่งเดียวกันเกิดขึ้นกับฉันก่อนหน้านี้ด้วย Java โดยใช้ Maven 3.x เพื่อคอมไพล์ใน i3 การปล่อยให้เป็นค่าเริ่มต้นสำหรับเธรด"4"นั้นช้ากว่ามากใกล้ 50% ช้ากว่าบอกไว้ชัดเจนว่าใช้ 2 คอร์เท่านั้น

ฉันคิดว่ามีบางอย่างเกี่ยวข้องกับการสลับบริบทแบบไฮเปอร์เธรดและการทับซ้อน I / O

มันสมเหตุสมผลเมื่อคุณเริ่มคิดเกี่ยวกับมัน คุณสามารถพิสูจน์ได้ว่าอะไรเป็นสาเหตุของความเสื่อมของผลลัพธ์ด้วยเครื่องมือการทำโปรไฟล์ระบบที่ดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.