2013-08-27 2 views
6

64 비트 Windows Server 2008 R2 Enterprise를 실행하는 서버에서 프로그램을 테스트하고 있으며 4 개의 Intel E7-4870 프로세서, 총 40 코어 및 80 개의 사용 가능한 스레드가 있습니다. Windows 작업 관리자에서 80 개의 CPU 사용 그래프를 볼 수 있습니다.CPU에서 사용 가능한 총 스레드의 절반 이상을 사용할 수 없습니다.

프로그램 코드는 같은 수 있습니다 :

numlist 목록 숫자의 수백을 포함하고, 각각 어떤 계산에 사용되는 매개 변수입니다

Parallel.ForEach(numlist, num => 
       { 
        // do some calculation using parameter = num    
       }); 

문제는 그 전에이 progrm을 실행할 때 서버에서는 사용 가능한 스레드의 절반 만 Windows 작업 관리자 (물론 CPU 사용률이 50 %로 표시)에 사용 된 것으로 표시되며 나머지 40 개는 모두 완전히 사용되지 않고 유휴 상태입니다.

2 개의 프로세서와 총 24 개의 사용 가능한 스레드 만있는 다른 서버에서도 동일한 프로그램을 테스트했으며 24 개의 스레드가 모두 완전히 사용되고 CPU 사용량이 100 %로 표시됩니다.

40 코어 CPU 서버에서이 프로그램을 실행하고 모든 80 스레드 (또는 80 스레드 가까이)를 완전히 활용할 수있는 방법이 있습니까? CPU 리소스의 50 % 만 사용하면 성능이 충분하지 않습니다. 이 2 개 인텔 X5690 프로세서 (사용 가능한 총 24 개 스레드)가있는 서버에서 실행되는

namespace Test 
{ 
    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      Console.WriteLine("Press any key to start"); 
      Console.ReadLine(); 
      List<int> numlist = new List<int>(); 
      for (int i = 0; i < 100; i++) 
      { 
       numlist.Add(i); 
      } 

      Parallel.ForEach(numlist, num => 
           { 
           while (true) 
           { 
            num++; 
           } 
          }); 

     } 
    } 
} 

, 24 개 스레드가 모두 사용된다 : 여기


내가 테스트하고 전체 프로그램 코드 CPU 사용량은 100 %로 표시됩니다.

80 개의 스레드를 사용할 수있는 4 개의 프로세서 서버에서 실행할 때 스레드가 40 개만 사용되고 CPU 사용량은 50 %에 불과합니다. 거기에 관련된 컴파일러 설정이 있습니까?

+0

숫자가 40 자 이상입니까? 여기에는 많은 정보가 없으므로 문제를 파악하기 어려울 것입니다. –

+0

예, numlist를 만들기 위해이 코드를 병렬 루프 앞에 넣습니다. List numlist = new List (); for (int i = 0; i <100; i ++) { numlist.Add (i); } – CMinusGuy

+2

'ParalellOptions'에서'MaxDegreeOfParallelism'을 사용해보세요. –

답변

7

작업 유형에 따라 hyper threading이 항상 도움이되는 것은 아닙니다. 순수한 수학 연산의 많은 유형으로, 각 중핵은 가공업자 "실 수"에 의해 건의되는 것과 같이 단지 2 개가 아닌 1 개의 노동 품목을 효과적으로 가공 할 수있다.

하이퍼 스레드는 실제로 별도의 코어가 아니므로 하이퍼 스레드에서 실행되는 명령어가 항상 이득으로 이어지는 것은 아닙니다. 이 discussed here입니다 :

클러스터 구성에 따라, 그리고 가장 중요한 것은, 클러스터에서 실행되는 응용 프로그램의 성격, 성능 향상은 다를 또는 음수가 될 수 있습니다. 다음 단계는 성능 도구를 사용하여 성능 향상에 기여하는 영역과 성능 저하에 기여하는 영역을 파악하는 것입니다.

하이퍼 스레딩은 전반적인 성능이 30 % 증가 최상의 경우의 주위로 이어질하는 경향이있다. 이 작업을 수행하려면 보통 코어의 각 스레드를 밀어 넣는 다른 CPU 명령어가 필요하므로 코어가 제대로 작업을 수행 할 수 있습니다. 많은 하이퍼 스레드 "CPU 스레드"에서 동일한 계산을 병렬로 실행할 때 코어 당 하나의 프로세스가 실행되는 것보다 유리한 경우가 종종 있습니다.

이는 CLR이 Windows 2008 R2에서 새 NUMA 명령어를 사용하지 않으므로 관리 코드를 사용하고 있기 때문에 발생할 수 있습니다. 관리 코드는 프로세서 그룹 0으로 제한됩니다.따라서 시스템이 프로세서 그룹 0이 40 개의 프로세서로 설정되고 나머지 40 개가 프로세서 그룹 1로 분리되면이 프로세스로 첫 번째 프로세서 그룹 전체가 포화 될 수 있습니다. 자세한 내용은 How to Get Started with Multi-Core: Parallel Processing You Can Use을 참조하십시오.

+0

그래,이 상황에서 성능의 차이를 이해하지만 내 관심사는 2 프로세서 24 스레드 서버에서 모든 스레드가 완전히 활용된다는 것입니다. 하지만 4 프로세서 80 스레드 서버에서는 절반 만 활용됩니까? .NET 컴파일러는 80 개의 스레드가 내 프로그램에 너무 많이 있다고 생각합니까? – CMinusGuy

+0

@CMinusGuy 작업을 보지 않고도 말하기는 매우 어렵지만 "24 스레드 서버"는 2, 12 코어 프로세서입니다. 여기서 "80 스레드 서버"는 하이퍼 스레딩 된 4 코어 프로세서입니다. –

+0

@CMinusGuy 다른 문서로 연결되도록 편집되었습니다. 관리 코드를 사용할 때 잠재적 인 64 개가 아닌 40 개의 procs 만 사용하도록 시스템에 프로세서 그룹 설정이있을 수 있습니다. –

관련 문제