Una buona regola empirica quando si eseguono attività intensive è eseguire lo stesso numero del core fisico contare.
Sì, è possibile eseguire più attività, ma attendono risorse (o thread in un pool di thread) e la propria casella, indipendentemente dalle dimensioni, non è in grado di allocare tutte le risorse core della cpu il 100% del tempo a una discussione dovuta allo sfondo/altri processi. Pertanto, più attività esegui, più threadi vengono generati, in quanto superano i possibili thread simultanei (1 per core), maggiore sarà la gestione delle risorse, l'accodamento e lo swapping.
Un test che abbiamo fatto dove lavoro ora utilizzando un modello virale per avviare attività aggiuntive trovato che era ottimale vicino al conteggio della CPU come un tappo. Le attività avviate con un rapporto uno a uno con il numero di core fisico sono state eseguite a circa 1 minuto per attività da completare. Impostato al doppio del conteggio della CPU, il tempo di attività è passato da una media di 1 minuto a circa 5 minuti di tempo medio per il completamento. Diventa geometricamente più lento più attività avviate dopo il core count.
Ad esempio, se si dispone di 8 core fisici, 8 attività (e l'utilizzo di TPL, essenzialmente 8 thread simultanei nel processo attivo) dovrebbero essere i più veloci. C'è il tuo thread o processo principale che crea le altre attività, e altri processi in background, ma se la scatola è abbastanza isolata per il tuo sfruttamento delle risorse, queste saranno abbastanza ridotte.
Il lato positivo della programmazione del limite di attività basato sul conteggio dei nuclei mentre si masticano le attività da una coda o da un elenco, quindi quando si distribuisce l'applicazione su riquadri di dimensioni diverse, si regola automaticamente.
Per determinare questo livello di codice, usiamo
var CoreCount = System.Environment.ProcessorCount/2;
Perché dividere per due, vi chiederete? Perché quasi tutti i processori moderni usano core logici o hyperthreading. Dovresti trovare con i tuoi test che se usi il conteggio logico, la tua velocità complessiva per compito, e quindi l'intero processo, diminuirà in modo significativo. I nuclei fisici sono la chiave. Non abbiamo potuto vedere un modo rapido per trovare fisico vs logico, ma una rapida panoramica delle nostre scatole ha rilevato che questo è sempre vero. YMMV, ma potrebbe essere abbastanza veloce.
Cosa fanno i fili? –
+1 buona domanda. Ognuno di loro fa una chiamata SOAP per trasmettere dati di soem e aspetta che ritorni – Mawg
Tranne, ovviamente, che il "ritorno" è asincrono, quindi non stanno davvero aspettando. Altri thread possono essere eseguiti non appena la richiesta SOAP (chiamata fcuntion) viene inviata su HTTP – Mawg