Determinar quién / qué reservado 5,5 GB de memoria virtual en w3wp.exe
-
21-08-2019 - |
Pregunta
En mi máquina (XP, 64) el proceso de trabajo ASP.net (w3wp.exe) siempre se pone en marcha con 5,5 GB de memoria virtual reservada. Esto ocurre independientemente de la aplicación web que hospeda (que puede ser cualquier cosa, incluso una página web vacía en aspx).
Esta gran parte antigua de la memoria virtual está reservado por el momento se inicia el proceso, por lo que esta no es una "fuga" gradual de la memoria de algún tipo.
Algunos husmear con windbg muestra que la memoria está pregunta es privado, reservado y RegionUsageIsVAD, lo que indica que podría ser obra de alguien llamando VirtualAlloc. También muestra que la memoria en cuestión está asignado / reservada en 4 grandes trozos de 1 GB cada uno y un varios más pequeños (1/4 GB cada uno).
Así que supongo que necesito averiguar quién está llamando VirtualAlloc y la reserva de toda esta memoria. ¿Cómo lo hago?
Colocación de un depurador al proceso previo a la asignación de memoria es complicado, porque w3wp.exe es un proceso iniciado por svchost.exe (es decir, IIS / filtro de ASP.Net) y si trato de poner en marcha yo mismo con el fin depurarlo simplemente cierra sin toda esta reserva de memoria profusa. Además, los parámetros de línea de comandos son válidos si los resuse (lo cual tiene sentido porque es un tubo creado por el proceso de llamada).
puedo enviar windbg al proceso después del hecho (que es lo que encontré las regiones de memoria en cuestión), pero no estoy seguro de que es posible en ese momento para determinar quién lo asignado.
Solución
David Wang respuestas a esta una pregunta similar :
[...] el desarrollador rendimiento ASP.Net me dice que:
- La memoria virtual Reservados hay nada de qué preocuparse. Puede ver como el rendimiento / requisito de almacenamiento en caché del CLR. Y de carga pesada muestra que es nada de qué preocuparse acerca de.
- System.Windows.Forms - No es empujados por vacío hola mundo ASPX página. Puede utilizar Microsoft Depuración Herramientas y "E ld sx System.Windows.Forms" para identificar qué en realidad está tirando de él en el momento de la ejecución. O puede ILDASM para encontrar el dependencia.
- mscorlib - asegurarse de que es GAC'd y NGen'd correctamente
.
Otros consejos
La memoria virtual es sólo el espacio de direcciones asignado al proceso. No tiene nada que ver con el uso de memoria.
Ver:
reservados de memoria es muy diferente de asignado memoria. La reserva de memoria justo asigna espacio de direcciones. No compromete a ninguna de las páginas físicas.
Este espacio de direcciones es probable asignado por IIS por su montón. Sólo se comprometerá páginas cuando sea necesario.
Si realmente quiere poner en marcha a partir de w3wp.exe windbg, es probable que necesite para poner en marcha con argumentos de línea de comandos válidos. Puede usar Process Explorer para determinar cuál es la línea de comandos para el actual proceso w3wp.exe es. Por ejemplo, en mi servidor, la mía era:
c:. \ Windows \ system32 \ inetsrv \ w3wp.exe -a \ \ pipe \ iisipmeca56ca2-3a28-452a-9ad3-9e3da7b7c765 -t 20 -ap "DefaultAppPool"
No estoy seguro de lo que el UID de allí se especifica, pero parece que probablemente ha generado sobre la marcha por el servicio W3SVC (que es lo que puso en marcha w3wp.exe) a nombre de la tubería especificada allí. Por lo que debería mirar a su línea de comandos antes de lanzar w3wp de windbg.