Tại sao nhiều lõi CPU trên máy ảo sẽ làm chậm thời gian biên dịch?


17

[chỉnh sửa # 2] Nếu bất kỳ ai từ VMWare có thể đánh tôi với một bản sao VMWare Fusion, tôi sẽ rất vui khi làm điều tương tự như so sánh VirtualBox vs VMWare. Bằng cách nào đó tôi nghi ngờ trình ảo hóa VMWare sẽ được điều chỉnh tốt hơn cho siêu phân luồng (xem câu trả lời của tôi quá)

Tôi đang thấy một cái gì đó tò mò. Khi tôi tăng số lượng lõi trên máy ảo Windows 7 x64, thời gian biên dịch tổng thể tăng thay vì giảm. Biên dịch thường rất phù hợp để xử lý song song như ở phần giữa (ánh xạ phụ thuộc bài), bạn có thể chỉ cần gọi một phiên bản trình biên dịch trên mỗi tệp .c / .cpp / .cs / bất cứ tệp nào để xây dựng các đối tượng một phần cho trình liên kết kết thúc. Vì vậy, tôi đã tưởng tượng rằng việc biên dịch sẽ thực sự mở rộng rất tốt với # lõi.

Nhưng những gì tôi đang thấy là:

  • 8 lõi: 1,89 giây
  • 4 lõi: 1,33 giây
  • 2 lõi: 1,24 giây
  • 1 lõi: 1,15 giây

Đây có phải chỉ đơn giản là một tạo tác thiết kế do triển khai hypanneror của một nhà cung cấp cụ thể (loại 2: hộp ảo trong trường hợp của tôi) hoặc một cái gì đó phổ biến hơn trên nhiều máy ảo để làm cho việc triển khai hypanneror đơn giản hơn? Với rất nhiều yếu tố, tôi dường như có thể đưa ra lập luận cả cho và chống lại hành vi này - vì vậy nếu ai đó biết nhiều về điều này hơn tôi, tôi sẽ tò mò đọc câu trả lời của bạn.

Cảm ơn Sid

[ chỉnh sửa: bình luận địa chỉ ]

@MartinBeckett: Biên dịch lạnh đã bị loại bỏ.

@MonsterTruck: Không thể tìm thấy dự án mã nguồn mở để biên dịch trực tiếp. Sẽ rất tuyệt nhưng không thể làm hỏng dev env của tôi ngay bây giờ.

@Mr Lister, @philosodad: Có 8 hw thread, sử dụng VirtualBox, vì vậy nên ánh xạ 1: 1 mà không cần mô phỏng

@Thorbjorn: Tôi có 6,5 GB cho VM và một dự án VS2012 nhỏ - không có khả năng tôi trao đổi vào / ra tệp rác trang.

@ Tất cả: Nếu ai đó có thể trỏ đến dự án VS2010 / VS2012 nguồn mở, đó có thể là tài liệu tham khảo cộng đồng tốt hơn dự án VS2012 (độc quyền) của tôi. Orchard và DNN dường như cần điều chỉnh môi trường để biên dịch trong VS2012. Tôi thực sự muốn xem liệu ai đó với VMWare Fusion cũng nhìn thấy điều này (đối với việc phân chia VMWare vs VirtualBox)

Chi tiết kiểm tra:

  • Phần cứng: Macbook Pro Retina
    • CPU: Core i7 @ 2.3Ghz (lõi tứ, siêu luồng = 8 lõi trong trình quản lý tác vụ windows)
    • Bộ nhớ: 16 GB
    • Đĩa: SSD 256 GB
  • Hệ điều hành máy chủ: Mac OS X 10.8
  • Loại VM: VirtualBox 4.1.18 (loại 2 trình ảo hóa)
  • Hệ điều hành khách: Windows 7 x64 SP1
  • Trình biên dịch: VS2012 biên dịch một giải pháp với 3 dự án C # Azure
    • Thời gian biên dịch được đo bằng plugin VS2012 có tên là 'VSCommands'
    • Tất cả các bài kiểm tra chạy 5 lần, 2 lần chạy đầu tiên bị loại bỏ, 3 lần kiểm tra trung bình cuối cùng

9
Có lẽ tệp I / O làm chậm nó với nhiều tác vụ và quyền truy cập đĩa vào ổ đĩa ảo
Martin Beckett

3
Tôi muốn tái tạo điều này trên máy của riêng tôi. Bạn có thể vui lòng tải lên một dự án mẫu ở đâu đó không? Tôi nghi ngờ máy ảo đang chơi trò bịp ở đây. Hãy thử khởi động vào Windows nguyên bản (Bootcamp) và xem nếu bạn quan sát hành vi tương tự - Tôi nghi ngờ bạn sẽ làm.
Apoorv Khurasia

1
Chúng tôi đang biên dịch gì ở đây? Rất nhiều thời gian để thực hiện song song một nhiệm vụ sẽ không được đền đáp cho đến khi bạn đạt được quy mô nhất định. Xem cách biên dịch apache hoặc ravendb.
Wyatt Barnett

2
Bạn có thể hết bộ nhớ trong máy ảo của mình để nó bắt đầu hoán đổi.

1
Điều tương tự đã xảy ra với tôi trước đây với Java khi sử dụng Maven 3.x để biên dịch trên i3. Để mặc định cho các luồng "4" chậm hơn nhiều, chậm hơn gần 50% so với việc nói rõ ràng là chỉ sử dụng 2 lõi. Tôi nghĩ rằng nó có một cái gì đó để làm với chuyển đổi bối cảnh siêu phân luồng và I / O chồng chéo.

Câu trả lời:


12

Trả lời: Nó không bị chậm, nó tăng quy mô với # lõi CPU. Dự án được sử dụng trong câu hỏi ban đầu là 'quá nhỏ' (thực ra là một tấn phát triển nhưng nhỏ / được tối ưu hóa cho trình biên dịch) để gặt hái những lợi ích của nhiều lõi. Có vẻ thay vì lên kế hoạch làm thế nào để truyền bá công việc, sinh ra nhiều quy trình biên dịch, v.v., ở quy mô nhỏ này, tốt nhất là nên đập vào công việc ngay lập tức.

Điều này dựa trên thử nghiệm mới mà tôi đã thực hiện dựa trên các nhận xét cho câu hỏi (và sự tò mò cá nhân của tôi). Tôi đã sử dụng một dự án VS lớn hơn - mã nguồn của Umbraco CMS vì nó lớn, có nguồn mở và người ta có thể tải trực tiếp tệp giải pháp và xây dựng lại (gợi ý: tải lên umbraco_675b272bb0a3\src\umbraco.slntrong VS2010 / VS2012).

NGAY BÂY GIỜ, những gì tôi thấy là những gì tôi mong đợi, tức là biên dịch mở rộng !! Chà, đến một điểm nào đó kể từ khi tôi tìm thấy:

Bảng kết quả

Hành trình:

  • Một lõi VM mới dẫn đến một Chủ đề OS X mới trong quy trình VirtualBox
  • Thời gian biên dịch tăng theo tỷ lệ như mong đợi (biên dịch đủ dài)
  • Tại 8 lõi VM, mô phỏng lõi có thể được kích hoạt trong VirtualBox vì hình phạt là rất lớn (50% đạt)
  • Những điều trên có khả năng là do OS X không thể hiển thị 4 lõi siêu phân luồng (luồng 8 h / w) dưới dạng 8 lõi cho VirtualBox

Điểm cuối cùng đó khiến tôi theo dõi lịch sử CPU trên tất cả các lõi thông qua 'Trình giám sát hoạt động' (lịch sử CPU) và những gì tôi tìm thấy là

Biểu đồ lịch sử CPU OS X

Hành trình:

  • Tại một lõi VM, hoạt động dường như nhảy qua 4 lõi CTNH. Làm cho ý nghĩa, để phân phối nhiệt đều ở cấp độ cốt lõi.

  • Ngay cả ở 4 lõi ảo (và 27 luồng VirtualBox OS X hoặc ~ 800 tổng số luồng OS X), chỉ các luồng CT thậm chí (0,2,4,6) gần như bão hòa trong khi các luồng CT lẻ (1,3,5,7) gần như ở mức 0%. Nhiều khả năng bộ lập lịch hoạt động theo các lõi CTNH và KHÔNG phải các luồng CT nên tôi suy đoán có lẽ nhân / bộ lập lịch OSX 64 bit không được tối ưu hóa cho CPU siêu luồng? Hoặc nhìn vào thiết lập lõi 8VM, có lẽ nó bắt đầu sử dụng chúng với mức sử dụng CPU cao? Một cái gì đó buồn cười đang diễn ra ... à, đó là một câu hỏi riêng cho một số nhà phát triển Darwin ...

[sửa]: Tôi muốn thử tương tự trong VMWare Fusion. Rất có thể nó sẽ không tệ như vậy. Tôi tự hỏi nếu họ trưng bày đây là một sản phẩm thương mại ...

Chân trang:

Trong trường hợp các hình ảnh biến mất, bảng thời gian biên dịch là (văn bản, xấu xí!)

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%

Tôi nghi ngờ sự sụt giảm giữa 4 và 8 là sự kết hợp của VM không được tối ưu hóa cho HT và HT không bằng bất kỳ cách nào bằng hai lần số lõi ( tốt nhất là tăng hiệu suất 30%, thường là ít hơn nhiều).
Daniel B

@DanielB: Với 4 => 8 lõi, vấn đề không chỉ là nó chỉ tăng 30% (so với + 100%) như bạn đề xuất - đó là hiệu suất thực sự là -50%. Nếu các luồng phần cứng hoàn toàn 'chết / vô dụng' và công việc bị chuyển hướng sang các lõi khác, thì hiệu năng sẽ là 0. Vì vậy, tôi sẽ có xu hướng nói rằng đó là thiết kế trên bộ ảo hóa loại 2 VirtualBox. Tôi tự hỏi VMWare Fusion là như thế nào ...
DeepSpace101

"Tại một lõi VM, hoạt động dường như nhảy qua 4 lõi CT. Điều này có nghĩa là phân phối nhiệt đều ở các cấp độ lõi" - không nhất thiết, thường là tốt hơn để lên lịch lại trên cùng một lõi (đối với bộ đệm, v.v.) nhưng nhà ảo thuật chỉ chọn một trong randon, hoặc lõi được sử dụng ít nhất bởi vì nó nghĩ rằng nó là một xử lý mục đích chung trong đó các quy trình khác đang sử dụng các lõi đó. Trong trường hợp này, tối ưu hóa lịch trình hoạt động chống lại bạn (nhưng theo một cách rất nhỏ)
gbjbaanb

@Sid đồng ý, tôi chỉ chỉ ra rằng với HT bạn sẽ nhận được (rất nhiều) giảm dần sẽ trả lại sớm hơn rất nhiều so với bạn nghĩ, nếu bạn cho rằng đó thực sự là bất cứ điều gì như cải thiện 100%. Trong trường hợp này, nó có thể dễ dàng gây tranh cãi cho HD của bạn gây ra điều này, do đó đề xuất trước đây của tôi về một số điểm chuẩn CPU nhân tạo.
Daniel B

6

Chỉ có một lý do có thể xảy ra, đó là chi phí của bạn vượt quá lợi nhuận của bạn.

Bạn có thể đang mô phỏng nhiều lõi, thay vì chỉ định các lõi thực tế hoặc thậm chí các tiến trình hoặc thậm chí các luồng từ máy chủ. Điều đó dường như rất có thể với tôi, và rõ ràng là sẽ cung cấp cho bạn tăng tốc tiêu cực.

Khả năng khác là bản thân quá trình này không song song tốt, và thậm chí cố gắng song song hóa nó cũng khiến bạn tốn nhiều chi phí truyền thông hơn là bạn đạt được.


your overhead is exceeding your gains: Đúng nhưng khá nhiều thứ bao trùm mọi thứ mà không biết điều gì thực sự gây ra nó :) ... Tôi đang sử dụng VirtualBox và có các lõi vật lý, vì vậy, giả sử ánh xạ phải là 1: 1 mà không cần mô phỏng. Tôi sẽ tìm kiếm một mã nguồn mở LỚN VS2012 để những người khác cũng có thể tham khảo nó ... brb
DeepSpace101

@Sid theo câu trả lời này superuser.com/a/297727 VM hộp ảo nên sử dụng các lõi máy chủ một cách thích hợp. Nhưng tôi vẫn kiểm tra những gì đang xảy ra trên máy chủ, để đảm bảo rằng hành vi dự kiến ​​đang xảy ra.
philosodad

0

Mày không đơn độc ...

Điều tương tự đã xảy ra với tôi trước đây với Java khi sử dụng Maven 3.x để biên dịch trên i3. Để mặc định cho các luồng "4" chậm hơn nhiều, chậm hơn gần 50% so với việc nói rõ ràng là chỉ sử dụng 2 lõi.

Tôi nghĩ rằng nó có một cái gì đó để làm với chuyển đổi bối cảnh siêu phân luồng và I / O chồng chéo.

Nó có ý nghĩa khi bạn bắt đầu nghĩ về nó. Bạn có thể chứng minh điều gì gây ra sự suy biến kết quả bằng một công cụ định hình toàn hệ thống tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.