가상 머신에서 더 많은 CPU 코어가 컴파일 시간을 느리게하는 이유는 무엇입니까?


17

[edit # 2] VMWare의 누군가가 VMWare Fusion의 사본으로 저를 때릴 수 있다면 VirtualBox와 VMWare의 비교와 같은 일을하는 것이 더 행복 할 것입니다. 어떻게 든 VMWare 하이퍼 바이저가 하이퍼 스레딩에 더 잘 맞춰질 것이라고 생각합니다 (내 답변도 참조하십시오)

궁금한 점이 있습니다. Windows 7 x64 가상 시스템에서 코어 수를 늘리면 전체 컴파일 시간 줄어들지 않고 늘어납니다 . 컴파일은 일반적으로 중간 부분 (포스트 종속성 매핑)에서와 같이 병렬 처리에 매우 적합합니다. 링커가 취할 부분 객체를 만들기 위해 각 .c / .cpp / .cs / whatever 파일에서 컴파일러 인스턴스를 호출 할 수 있습니다 위에. 그래서 컴파일은 실제로 # 개의 코어로 확장 될 것이라고 상상했을 것입니다.

그러나 내가보고있는 것은 :

  • 8 코어 : 1.89 초
  • 4 코어 : 1.33 초
  • 2 코어 : 1.24 초
  • 1 코어 : 1.15 초

특정 벤더의 하이퍼 바이저 구현 (필자의 경우 type2 : virtualbox) 또는 하이퍼 바이저 구현을 더 단순하게 만들기 위해 더 많은 VM에 더 널리 퍼져있는 설계 아티팩트입니까? 너무 많은 요인으로, 나는이 행동과 반대되는 주장을 할 수있는 것 같습니다. 그래서 누군가가 나보다 이것에 대해 더 많이 알고 있다면, 나는 당신의 대답을 읽고 싶어합니다.

감사합니다 시드

[ 편집 : 주소록 주석 ]

@MartinBeckett : 콜드 컴파일이 삭제되었습니다.

@MonsterTruck : 직접 컴파일 할 오픈 소스 프로젝트를 찾을 수 없습니다. 좋을 것이지만 지금 내 개발 환경을 망칠 수는 없습니다.

@Mr Lister, @philosodad : VirtualBox를 사용하여 8 개의 hw 스레드가 있으므로 에뮬레이션없이 1 : 1 매핑이어야합니다.

@Thorbjorn : VM에 6.5GB가 있고 작은 VS2012 프로젝트가 있습니다. 페이지 파일을 휴지통에 넣거나 버릴 가능성이 거의 없습니다.

@All : 누군가 오픈 소스 VS2010 / VS2012 프로젝트를 가리킬 수 있다면 내 (독점) VS2012 프로젝트보다 커뮤니티 참조가 더 좋습니다. 오차드와 DNN은 VS2012에서 컴파일하기 위해 환경 조정이 필요한 것 같습니다. VMWare Fusion을 사용하는 사람이 이것을 볼 수 있는지 정말로 알고 싶습니다 (VMWare 대 VirtualBox 구획화).

테스트 세부 사항 :

  • 하드웨어 : Macbook Pro Retina
    • CPU : Core i7 @ 2.3Ghz (쿼드 코어, 하이퍼 스레드 = Windows 작업 관리자의 8 코어)
    • 메모리 : 16GB
    • 디스크 : 256GB SSD
  • 호스트 OS : Mac OS X 10.8
  • VM 유형 : VirtualBox 4.1.18 (유형 2 하이퍼 바이저)
  • 게스트 OS : Windows 7 x64 SP1
  • 컴파일러 : 3 개의 C # Azure 프로젝트로 솔루션을 컴파일하는 VS2012
    • 'VSCommands'라는 VS2012 플러그인으로 컴파일 시간 측정
    • 모든 테스트는 5 번 실행되며 처음 2 번은 삭제되고 마지막 3 번은 평균

9
아마도 파일 I / O는 다중 작업과 디스크 드라이브가 가상화 된 드라이브에 액세스하는 속도를 늦추고 있습니다.
Martin Beckett

3
내 컴퓨터에서 이것을 재현하고 싶습니다. 샘플 프로젝트를 어딘가에 업로드 할 수 있습니까? 가상 머신이 여기에서 트릭을 재생하고 있다고 생각합니다. Windows로 기본 부팅 (Bootcamp)을 시도하고 동일한 동작이 관찰되는지 확인하십시오.
Apoorv Khurasia 5

1
여기서 컴파일하고있는 것은 무엇입니까? 작업을 병렬화하는 오버 헤드는 특정 규모에 도달 할 때까지 지불하지 않습니다. 아파치 또는 ravendb 컴파일 방법을 참조하십시오.
Wyatt Barnett 1

2
가상 머신의 메모리가 부족하여 스왑을 시작합니다.

1
Java에서 Maven 3.x를 사용하여 i3에서 컴파일하는 것과 동일한 일이 발생했습니다. 스레드를 기본값으로 "4"로 설정 하면 명시 적으로 2 개의 코어 만 사용하도록 지시하는 것보다 훨씬 느리고 50 % 정도 느립니다. 하이퍼 스레딩 컨텍스트 전환 및 겹치는 I / O와 관련이 있다고 생각합니다.

답변:


12

답변 : 속도가 느려지지 않으며 CPU 코어 수에 따라 확장됩니다. 원래의 질문에 사용 된 프로젝트는 (실제로 A의 '너무 작은'이었다 멀티 코어의 이점을 얻을 수있는 개발하지만, 컴파일러 최적화 된 소 / 중). 작업을 퍼 뜨리고 여러 컴파일러 프로세스를 생성하는 방법을 계획하는 대신이 소규모로 작업을 직렬로 진행하는 것이 가장 좋습니다.

이것은 질문에 대한 의견과 개인적 호기심을 바탕으로 한 새로운 실험을 기반으로합니다. Umbraco CMS의 소스 코드 는 규모가 크고 오픈 소스이므로 솔루션 파일을 직접로드하고 다시 빌드 할 수 있기 때문에 더 큰 VS 프로젝트를 사용했습니다 (힌트 : umbraco_675b272bb0a3\src\umbraco.slnVS2010 / VS2012에서 로드 ).

지금, 내가 보는 것은 내가 기대하는 것, 즉 컴파일 스케일 업 !! 글쎄, 내가 찾은 이후 특정 지점으로 :

결과표

테이크 아웃 :

  • 새로운 VM 코어는 VirtualBox 프로세스 내에서 새로운 OS X 스레드를 만듭니다
  • 컴파일 시간이 예상대로 확장됩니다 (컴파일이 충분히 길다)
  • 8 개의 VM 코어에서 패널티가 엄청 나기 때문에 VirtualBox 내에서 코어 에뮬레이션이 시작될 수 있습니다 (50 % 적중)
  • OS X이 4 개의 하이퍼 스레드 코어 (8 h / w 스레드)를 VirtualBox에 8 코어로 제공 할 수 없기 때문에 위의 가능성이 있습니다.

그 마지막 시점으로 인해 'Activity Monitor'(CPU 기록)를 통해 모든 코어에서 CPU 기록을 모니터링하고 내가 찾은 것은

OS X CPU 히스토리 그래프

테이크 아웃 :

  • 하나의 VM 코어에서 활동은 4 개의 HW 코어에서 도약하는 것 같습니다. 코어 수준에서 균일하게 열을 분산시키는 것이 합리적입니다.

  • 4 개의 가상 코어 (및 27 개의 VirtualBox OS X 스레드 또는 전체 ~ 800 OS X 스레드)에서도 HW 스레드 (0,2,4,6) 만 채도가 높은 반면 홀수 HW 스레드 (1,3,5,7) 거의 0 %에 있습니다. 스케줄러가 HW 코어 및 NOT HW 스레드 측면에서 작동하므로 OSX 64 비트 커널 / 스케줄러가 하이퍼 스레드 CPU에 최적화되어 있지 않을 것이라고 생각합니까? 아니면 8VM 코어 설정을 살펴보면 CPU 사용률이 높은 %에서 사용하기 시작합니까? 재미있는 일이 하나 있습니다 ... 글쎄, 그것은 일부 다윈 개발자에게는 별도의 질문입니다 ...

[편집] : VMWare Fusion에서 동일하게 시도하고 싶습니다. 그다지 나쁘지 않을 것입니다. 그들이 이것을 상용 제품으로 선보일 지 궁금합니다 ...

보행인:

이미지가 사라지면 컴파일 타임 테이블은 (text, ugly!)입니다.

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 사이의 하락은 HT에 최적화되지 않은 VM과 HT의 조합이 코어의 두 배와 같지 않다고 생각합니다 ( 최고 30 %의 성능 향상, 일반적으로 훨씬 적음).
Daniel B

@DanielB : 4 => 8 코어에서 문제는 제안한 것처럼 단순히 + 30 % 향상 (vs + 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: 사실이지만 실제로 발생하는 원인을 모른 채 거의 모든 것을 처리합니다. 나는 다른 사람들이 참조 할 수 있도록 대형 오픈 소스 VS2012 너무 ... BRB 검색 할거야
DeepSpace101

@Sid이 답변 superuser.com/a/297727에 따르면 virtualbox VM은 호스트 코어를 적절하게 사용해야합니다. 그러나 여전히 호스트에서 발생하는 상황을 확인하여 예상되는 동작이 발생하는지 확인합니다.
철학자

0

당신은 혼자가 아닙니다 ...

Java에서 Maven 3.x를 사용하여 i3에서 컴파일하는 것과 동일한 일이 발생했습니다. 스레드를 기본값으로 "4"로 설정 하면 명시 적으로 2 개의 코어 만 사용하도록 지시하는 것보다 훨씬 느리고 50 % 정도 느립니다.

하이퍼 스레딩 컨텍스트 전환 및 겹치는 I / O와 관련이 있다고 생각합니다.

당신이 그것에 대해 생각하기 시작하면 의미가 있습니다. 우수한 시스템 전체 프로파일 링 도구를 사용하여 결과의 ​​성능 저하 원인을 증명할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.