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 %에 불과합니다. 거기에 관련된 컴파일러 설정이 있습니까?
숫자가 40 자 이상입니까? 여기에는 많은 정보가 없으므로 문제를 파악하기 어려울 것입니다. –
예, numlist를 만들기 위해이 코드를 병렬 루프 앞에 넣습니다. List numlist = new List (); for (int i = 0; i <100; i ++) { numlist.Add (i); } –
CMinusGuy
'ParalellOptions'에서'MaxDegreeOfParallelism'을 사용해보세요. –