2014-11-09 5 views
9

У меня есть сервер с 2 узлами NUMA с 16 процессорами каждый. Я вижу все 32 процессора в диспетчере задач, первый 16 (узел NUMA 1) в первых двух строках и следующий 16 (узел NUMA 2) в последних двух строках.Почему мое. Net-приложение использует только один узел NUMA?

В моем приложении я запускаю 64 потока, используя Thread.Start(). Когда я запускаю приложение, процессор пересекается, только первые 16 процессоров заняты, остальные 16 процессоров простаивают.

Почему? Я использую Interlocked.Increment() много, может ли это быть причиной? Есть ли способ, с помощью которого я могу запускать потоки на определенном узле NUMA?

ответ

1

Вы установили сборщик мусора на серверную версию?

В app.config, попробуйте:

<configuration 
    <runtime> 
     <gcServer enabled="true"/> 
    </runtime> 
</configuration> 

Из-за способом отвалов выделяемыми ГЙ сервера делает огромную разницу, когда сбивает много объектов/данных на множестве потоков в машине с много ядер.

+1

Этот параметр не изменяет поведение. –

9

В дополнение к gcserver мы должны позволить GCCpuGroup и Thread_UseAllCpuGroups поэтому конфигурация должна быть больше как:

<configuration 
    <runtime> 
     <gcServer enabled="true"/> 
     <GCCpuGroup enabled="true"/> 
     <Thread_UseAllCpuGroups enabled="true"/> 
    </runtime> 
</configuration> 

GcCpuGroup позволяет Garbage Collection для нескольких групп процессоров и Thread_UseAllCpuGroups позволяет управлять распределением потоков во всех группах CPU для выполнения ,

2

Первое, что нужно проверить, будет действительно app.config убедившись, что необходимые параметры установлены:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <runtime> 
     <gcServer enabled="true" /> 
     <Thread_UseAllCpuGroups enabled="true" /> 
     <GCCpuGroup enabled="true" /> 
    </runtime> 
    <startup> 
     <!-- 4.5 and later should work, use the one targeted --> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/>  
    </startup> 
</configuration> 

Если app.config -Wizadry не помогает, вероятно, что ваша машина использует несколько групп ядра (Kgroups), когда это не должно. Затем вы можете проверить свой BIOS на NUMA Group Size Optimization, если у вас есть Gen9 HP. Если он находится в режиме Clustered, текущий CLR (2017, .net 4.6.2) использует только первый. Если на этой машине имеется не более 64 ядер, вы должны выбрать макет Flat, который помещает все ядра в одну группу. Если вы не можете найти его, you may need a BIOS Update.

Для получения дополнительной информации см. Unable to use more than one processor group for my threads in a C# app здесь, на StackOverflow. Он даже поставляется со своим собственным diagnostics tool.