40

Parallel.ForEach를 사용하고 있는데 일부 데이터베이스 업데이트를하고 있습니다. 이제는 MaxDegreeOfParallelism을 설정하지 않고 듀얼 코어 프로세서가 SQL 클라이언트 시간 초과 결과를 보았습니다. 다른 곳에서는 쿼드 코어 프로세서 컴퓨터가 시간 초과되지 않습니다.MaxDegreeOfParallelism의 기능은 무엇입니까?

이제는 코드가 실행되는 곳에서 사용할 수있는 프로세서 코어 종류를 제어 할 수 없지만 MaxDegreeOfParallelism으로 변경할 수있는 설정이 있습니다.이 설정은 적은 작업을 동시에 실행하고 시간 제한을 초래하지 않을 수 있습니까?

타임 아웃을 늘릴 수 있지만 좋은 솔루션이 아닙니다. CPU가 적 으면 동시에 적은 작업을 처리 할 수 ​​있기 때문에 CPU에 부하가 적습니다.

나는 다른 모든 게시물과 MSDN도 읽었지만 MaxDegreeOfParallelism을 설정하면 내 쿼드 코어 컴퓨터가 고통을 겪을 수 있습니까?

예를 들어, CPU가 두 개의 코어를 갖고 있다면, 어쨌든 거기에 있습니까? 그렇다면 CPU에 코어가 4 개 있고 40 개가 있다면 20 개를 사용합니까?

답변

58

답변은 코어 수와 관계없이 전체 병렬 연산의 상한선입니다.

IO 또는 잠금을 기다리고 있기 때문에 CPU를 사용하지 않더라도 여분의 작업은 병렬로 실행되지 않고 사용자가 지정한 최대 작업 만 실행됩니다.

이 부분을 찾으려면이 테스트 코드를 작성하십시오. 거기에 더 많은 스레드를 사용하도록 TPL을 자극하는 인공 잠금 장치가 있습니다. 코드가 IO 또는 데이터베이스를 기다리고있을 때도 마찬가지입니다. 내가 MaxDegreeOfParallelism을 지정하지 않으면

class Program 
{ 
    static void Main(string[] args) 
    { 
     var locker = new Object(); 
     int count = 0; 
     Parallel.For 
      (0 
      , 1000 
      , new ParallelOptions { MaxDegreeOfParallelism = 2 } 
      , (i) => 
        { 
         Interlocked.Increment(ref count); 
         lock (locker) 
         { 
          Console.WriteLine("Number of active threads:" + count); 
          Thread.Sleep(10); 
         } 
         Interlocked.Decrement(ref count); 
        } 
      ); 
    } 
} 

는 콘솔 로깅은 약 8 작업까지 동시에 실행되는 것을 보여줍니다. 이처럼 :

Number of active threads:6 
Number of active threads:7 
Number of active threads:7 
Number of active threads:7 
Number of active threads:7 
Number of active threads:7 
Number of active threads:6 
Number of active threads:7 
Number of active threads:7 
Number of active threads:7 
Number of active threads:7 
Number of active threads:7 
Number of active threads:7 
Number of active threads:7 
Number of active threads:7 
Number of active threads:7 
Number of active threads:7 
Number of active threads:7 
Number of active threads:7 

그것은 낮은 시작, 시간이 지남과 끝에 증가는 동시에 8을 실행하는 데 노력하고있다. 내가 어떤 임의의 값으로 제한하는 경우

은 (예를 들어 2), 나는

Number of active threads:2 
Number of active threads:1 
Number of active threads:2 
Number of active threads:2 
Number of active threads:2 
Number of active threads:2 
Number of active threads:2 
Number of active threads:2 
Number of active threads:2 
Number of active threads:2 
Number of active threads:2 
Number of active threads:2 
Number of active threads:2 
Number of active threads:2 
Number of active threads:2 
Number of active threads:2 
Number of active threads:2 

아를 얻을이는 쿼드 코어 시스템에 있습니다.

+0

내 논리에는 대기 또는 IO가 없으며, SQL을 업데이트합니다. 그렇지만 SQL은 자체적으로 수행 할 수도 있지만 대부분 SQL이 완료 될 때까지 기다리고 있습니다. 활성 스레드의 기본 최대 개수는 얼마입니까? –

+0

코어 당 기본값은 2이지만 코드가 CPU를 사용하지 않는 경우 TPL이이 값을 올릴 수 있습니다. 대부분의 데이터베이스는 일정량의 IO를 필요로합니다. –

+1

6 코어 머신이 과중하게로드되는 경우 1 또는 2 개의 스레드 만 사용합니다. 가볍게로드되면 최대 12 개까지 올라갑니다. 기존 시스템로드를 고려할만큼 지능적입니다. – Contango

-1

가 병렬로 실행하는 스레드의 수를 설정 ...

+0

하지만 코어를 고려합니까? –

+0

기본적으로 어떤 종류의 데이터베이스를 사용하고 있습니까? – SolidSnake

+0

동일한 OS, 동일한 프로그램, 동일한 데이터 (기본 Replicators), 하나는 듀얼 쿼드 코어가있는 하이 엔드 머신이고 두 개는 단순한 듀얼 코어 머신이며 동일한 프로그램이 다른 서버의 데이터를 가져 와서 데이터를 다시 SQL에 저장합니다. 얼룩 및 이미지). –

1

그것은 당신이 당신이 찾고 그 원인을 문제를 해결할 수없는 즉, 교착되어 병렬로 실행중인 코드 같은 소리, 당신은 그것을 전혀 병렬 처리해서는 안됩니다.

+0

-1, 질문에 대한 병렬 또는 병렬로, SQL은 자체 계산을하지만 너무 많은 병렬 요청에 대해 클라이언트가 시간 초과하게 간단하지 않습니다, 나는 적은 작업을 실행하고 싶습니다. 같은 논리를 가진 쿼드 코어 머신의 교착 상태는 문제가되지 않습니다. 동일한 SQL이 잘 돌아가며, 시간 제한을 계속 늘리고 싶지 않습니다. –

+0

제한 시간을 늘리려고 시도하고 작동하는지 확인 했습니까? 동시성 문제는 극도로 미묘 할 수 있으며 많은 것들이 사라지거나 겉으로보기에 무작위로 나타날 수 있습니다. 더 많은 코어를 가진 다른 머신에서 작동한다는 것이 그것이 깨지지 않았거나 더 많은 코어가 도움이된다는 것을 의미하지는 않습니다. – jimrandomh

+0

시간 초과가 증가하면 도움이됩니다. 하지만 여하튼 CPU 사용량은 소형 기계에서 50 % 이상이고 큰 기계에서는 5 % 미만입니다. 이제 성능 문제를 찾아야하고 코드를 변경하거나 필요가있는 부분이 있습니다. CPU를 업그레이드하십시오. –

13

예를 들어, CPU가 2 개의 코어를 가지고 있다면 CPU가 4 개 코어를 가지고 있고 40 개 코어를 가지고 있다면 20을 사용합니까?

당신은 CPU 코어의 수에 병렬 의존하기 위해이 작업을 수행 할 수 있습니다

var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount * 10 }; 
Parallel.ForEach(sourceCollection, options, sourceItem => 
{ 
    // do something 
}); 

그러나, CPU의 새로운 여분의 코어를 시뮬레이션하기 위해 하이퍼 스레딩을 사용하는 경향이있다. 따라서 쿼드 코어 프로세서를 사용하는 경우 Environment.ProcessorCount은이를 8 코어로보고합니다. 시뮬레이트 된 코어를 고려하여 병렬 처리를 설정하면 실제로 UI 스레드와 같은 다른 스레드의 속도가 느려집니다.

작업이 조금 더 빨라지더라도 응용 프로그램 UI에는이 시간 동안 상당한 지연이 발생할 수 있습니다. `Environment.ProcessorCount '를 2로 나눈 것은 동일한 처리 속도를 달성하는 반면 CPU는 여전히 UI 스레드를 사용할 수 있습니다.

관련 문제