Determinare chi / cosa riservata 5,5 GB di memoria virtuale in w3wp.exe
-
21-08-2019 - |
Domanda
Sulla mia macchina (XP, 64) il processo di lavoro ASP.net (w3wp.exe) lancia sempre con 5,5 GB di memoria virtuale riservata. Questo avviene indipendentemente dall'applicazione web è di hosting (può essere qualsiasi cosa, anche una pagina web vuota in aspx).
Questa grande vecchio pezzo di memoria virtuale, è riservata in questo momento inizia il processo, quindi questo non è un ricordo graduale "fuga" di qualche tipo.
Alcuni curiosare in giro con WinDbg mostra che la memoria è questione è privata, riservata e RegionUsageIsVAD, che indica che potrebbe essere opera di qualcuno che chiama VirtualAlloc. Essa mostra inoltre che la memoria in questione è allocato / riservato in 4 grandi blocchi di 1 GB ciascuna ea altri più piccoli (1/4 GB ciascuno).
Quindi penso che ho bisogno di capire chi sta chiamando VirtualAlloc e riservando tutta questa memoria. Come faccio a farlo?
Collegamento di un debugger al processo prima della allocazione di memoria è difficile, perché w3wp.exe è un processo avviato da svchost.exe (vale a dire, IIS / filtro ASP.Net) e se provo a lanciare io stesso, al fine di per eseguire il debug solo chiude senza tutta questa riserva di memoria profusa. Inoltre, i parametri della riga di comando non sono validi se li resuse (che ha un senso, perché è un tubo creato dal processo chiamante).
Posso collegare windbg al processo dopo il fatto (che è come ho trovato le aree di memoria in questione), ma non sono sicuro che sia possibile in quel punto per determinare chi allocato cosa.
Soluzione
David Wang le risposte a un domanda simile :
[...] lo sviluppatore prestazioni ASP.Net mi dice che:
- La memoria virtuale riservati è nulla di cui preoccuparsi. È possibile visualizzare come prestazioni / caching prerequisito del CLR. E test di carico pesante dimostra che non è nulla di cui preoccuparsi di.
- System.Windows.Forms - non è tirato dentro dal mondo ciao vuoto ASPX pagina. È possibile utilizzare Microsoft Debugging Strumenti e "sx e ld System.Windows.Forms" per identificare ciò che è in realtà tirandolo in fase di esecuzione. Oppure si può ILDASM di trovare la dipendenza.
- mscorlib - assicurarsi che sia GAC'd e NGen'd correttamente
.
Altri suggerimenti
La memoria virtuale è solo lo spazio di indirizzamento assegnato al processo. Non ha nulla a che fare con l'utilizzo di memoria.
See:
Reserved memoria è molto diverso da allocato memoria. Riservando memoria solo alloca spazio di indirizzi. Essa non commette alcun pagine fisiche.
Questo spazio indirizzo è probabile assegnato da IIS per il suo mucchio. Essa si impegnerà solo le pagine quando necessario.
Se davvero si vuole lanciare w3wp.exe da windbg, probabilmente è necessario lanciarlo con gli argomenti della riga di comando valide. È possibile utilizzare Process Explorer per determinare ciò che la riga di comando per la corrente processo w3wp.exe è. Per esempio, sul mio server, il mio era:
c:. \ Windows \ system32 \ inetsrv \ w3wp.exe -a \ \ pipe \ iisipmeca56ca2-3a28-452a-9ad3-9e3da7b7c765 -t 20 -ap "DefaultAppPool"
Non sono sicuro di ciò che l'UID in là specifica, ma sembra è probabilmente generato al volo dal servizio W3SVC (che è quello che ha lanciato w3wp.exe) per il nome del tubo di là specificato. Quindi si dovrebbe assolutamente guardare la vostra linea di comando prima di lanciare w3wp da windbg.