2015-01-15 10 views
5

Sulla mia macchina, Windows 7 - Enterprise con 1 x Intel Xeon E5-1660 0 @ 3.30Ghz (6 core/CPU con Hyper Threading attivato), Environment.ProcessorCount restituisce 12 che è esatto.C# Environment.ProcessorCount non restituisce sempre il numero completo di Processore logico, perché?

Su Windows Server 2012 con 2 x Intel Xeon E5-2697 v3 @ 2,60 GHz (14 core/CPU con Hyper Threading attivato (penso perché Task Manager mostra: 2 socket, 28 core, 56 processori logici)), Environment.ProcessorCount restituisce 28 che ci sembra sbagliato perché 2x14x2 = 56.

Perché su Windows Server 2012 C# metodo Environment.ProcessorCount non restituisce il numero corretto di processori logici?

informazioni supplementari, le variabili di ambiente sono i seguenti: NUMBER_OF_PROCESSORS = 28

TaskManager

Aggiornamento 2015/05/26:

There is a Più dettagli/motivi di questo correlate bug nella mia altra domanda: Unable to use more than one processor group for my threads in a C# app. Principalmente penso che C# usi solo un gruppo di processori. La cosa interessante era che sul nostro server c'erano 2 gruppi di processori, sebbene ci fossero solo 56 processori logici. Ma questo HP CUSTOMER ADVISORY spiega perché la nostra configurazione del BIOS del server stava inducendo finestre in errore.

+0

Sono sorpreso che 'Environment.PermissionAccess' ti dà tutte le informazioni sulla CPU :-) I non riesco nemmeno a trovarlo documentato. –

+0

Spiacente, ho modificato il titolo della mia domanda ... Ho usato il nome del metodo sbagliato. Mi dispiace. Grazie per le informazioni. –

risposta

4

Ci può essere un accenno nella documentazione:

"Se la macchina corrente contiene più gruppi di processori, questa proprietà restituisce il numero di processori logici che sono disponibili per l'utilizzo da parte del Common Language Runtime (CLR) ".

Potrebbe essere questo il problema qui?

MSDN Article

qualcosa Trovato altro interessante:

Per default, la piscina è limitato ad un gruppo processore singolo (http://msdn.microsoft.com/en-us/library/windows/desktop/dd405503(v=vs.85).aspx), e quindi a 64 core. Tuttavia, in .NET 4.5 è possibile impostare il flag Thread_UseAllCpuGroups = "true".

MSDN Forum Post

+0

Sì, potrebbe essere ... ma è quello che sto cercando. Una spiegazione del perché il numero disponibile è inferiore all'importo totale? ... Un problema di licenza, un'impostazione di Windows, il comportamento normale di Windows ??? –

+0

Mi chiedo se il CLR non sia in modo predefinito o non sia in grado di rilevare una seconda CPU fisica? Non sono esperto in questo settore, ma sono sinceramente curioso. – user2366842

+0

@ user2366842, sono d'accordo, mi chiedo se è il caso (pensavo che potesse essere), non ne ho idea, ho cercato senza successo il motivo per cui? –

0

Controllare i NUMBER_OF_PROCESSORS sistema variabile di ambiente. Ecco cosa restituisce il metodo. Vedere l'articolo MSDN: http://msdn.microsoft.com/en-us/library/system.environment.processorcount%28v=vs.100%29.aspx (sezione dei permessi).

+0

Lo so ma non risponde al motivo per cui ho solo la metà. Voglio una documentazione che dica perché ne ho solo la metà. Se è davvero perché Environment.ProcessorCount non prende in considerazione la seconda CPU, la userò. Ma se vedo solo metà di esso a causa di un'impostazione di Windows Server, non sarebbe logico moltiplicare per il numero di CPU. –

+0

Per vostra informazione, il vostro collegamento è alla versione 4 del framework. Nella versione 4.5 le informazioni sulla variabile d'ambiente sono state rimosse e per una buona ragione: non è vero. Ho cambiato la variabile di ambiente e ho eseguito la mia app e vedo ancora solo la metà dei processori logici (tutti nello stesso ambiente - lo stesso prompt di cmd). Ma grazie per aver provato. –

2

Secondo the MSDN docs on <Thread_UseAllCpuGroups> è necessario impostare la seguente per avere tutti i gruppi della CPU visto e utilizzato:

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

Grazie, hai ragione. Ma l'ho già fatto. Ho aggiunto un aggiornamento alla mia domanda perché ho ricevuto molti feedback da HP riguardo a questo problema (aggiunto in un'altra domanda StackOverflow) –

Problemi correlati