Domanda

Ho un'applicazione Web multi-thread con circa 1000 ~ 2000 thread in ambiente di produzione.

Mi aspetto l'utilizzo della CPU w3wp.exe ma System Idle Process mangia CPU. Come mai?

È stato utile?

Soluzione

Il processo inattivo non è in realtà un processo reale, non "mangia" il tuo tempo della CPU. La CPU %che vedi accanto è effettivamente inutilizzata %CPU (più o meno).

Il motivo delle scarse prestazioni dell'applicazione è molto probabilmente dovuta ai tuoi thread 2000. Windows (o addirittura qualsiasi sistema operativo) non ha mai dovuto eseguire così tanti thread alla volta. Stai sprecando per la maggior parte del tempo, solo il contesto che passa tra loro, ognuno ottenendo un paio di millisecondi di tempo di elaborazione ogni ~ 30 secondi (15 ms*2000 = 30 secondi !!!!).

Ripensare la tua applicazione.

Altri suggerimenti

Il processo inattivo è semplicemente trattenere il tempo di processo fino a quando un programma non ne ha bisogno, in realtà non mangia alcun ciclo. Puoi pensare il tempo inattivo del sistema come "CPU disponibile"

System Idle Process non è un processo reale, rappresenta il tempo del processore inutilizzato.

Ciò significa che la tua app non utilizza completamente il processore: potrebbe essere legato alla memoria o legata alla CPU; Forse i thread si aspettano l'uno all'altro o per risorse esterne? Anche le spese generali di commutazione del contesto potrebbero essere un colpevole - a meno che tu non abbia 2000 core, i thread non lo sono in realtà Esegui tutto allo stesso tempo, ma le fette di tempo assegnate dallo Scheduler di attività, richiede anche un po 'di tempo.

Non hai fornito molti dettagli, quindi posso solo speculare a questo punto. Direi che è probabile che la maggior parte di quei thread non stia facendo nulla. Quelli che stanno facendo qualcosa sono probabilmente vincolati nel senso che stanno spendendo la maggior parte della loro attesa che la risorsa esterna risponda.

Ora parliamo dei "1000 ~ 2000 thread". Ci sono pochissimi casi (forse nessuno) in cui avere tanti thread è una buona idea. Penso che il tuo problema attuale sia un perfetto esempio del perché. La maggior parte di quei thread (apparentemente comunque) non fanno altro che sprecare risorse. Se si desidera elaborare più attività in parallelo, in particolare se sono vincolati, allora è meglio trarre vantaggio da risorse aggregate come le ThreadPool o usando il Biblioteca parallela del compito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top