2014-11-09 13 views
9

Ho un server con 2 nodi NUMA con 16 CPU ciascuno. Posso vedere tutte le 32 CPU nel task manager, il primo 16 (nodo NUMA 1) nelle prime 2 righe e il successivo 16 (il nodo NUMA 2) nelle ultime 2 righe.Perché la mia app .Net viene utilizzata solo con un singolo nodo NUMA?

Nella mia app sto avviando 64 thread, utilizzando Thread.Start(). Quando eseguo l'app, la CPU interseca, solo le prime 16 CPU sono occupate, le altre 16 CPU sono inattive.

Perché? Sto usando Interlocked.Increment() molto, potrebbe essere una ragione? Esiste un modo per avviare i thread su un nodo NUMA specifico?

risposta

1

Hai impostato il garbage collector per la versione del server?

In app.config, prova:

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

causa del modo cumuli sono allocati il ​​GC server effettua una grande differenza quando zangolatura molti oggetti/dati su un sacco di fili in una macchina con molti core.

+1

Questa impostazione non modifica il comportamento. –

9

Oltre a gcserver che dovrebbe consentire GCCpuGroup e Thread_UseAllCpuGroups così la configurazione dovrebbe essere più simile:

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

GcCpuGroup permette garbage collection per più gruppi CPU e Thread_UseAllCpuGroups consente gestore distribuzione filo attraverso tutte le CPU per l'esecuzione .

2

prima cosa da verificare sarebbe infatti la app.config assicurandosi che le opzioni necessarie sono impostate:

<?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> 

Se app.config -Wizadry non aiuta, è probabile che la macchina utilizza più gruppi del kernel (Kgroups) quando non dovrebbe È quindi possibile controllare il BIOS per NUMA Group Size Optimization se si dispone di Gen9 HP. Se è nella modalità Clustered, l'attuale CLR (2017, .net 4.6.2) utilizza solo il primo. Se nella macchina non sono presenti più di 64 core, è possibile selezionare il layout Flat che inserisce tutti i core nello stesso gruppo. Se non riesci a trovarlo, you may need a BIOS Update.

Per ulteriori dettagli, vedere Unable to use more than one processor group for my threads in a C# app qui su StackOverflow. Viene anche fornito con il proprio diagnostics tool.