2008-12-10 7 views
7

En mi máquina (XP, 64) el proceso de trabajo de ASP.net (w3wp.exe) siempre se inicia con 5.5 GB de memoria virtual reservada. Esto sucede independientemente de la aplicación web que aloja (puede ser cualquier cosa, incluso una página web vacía en aspx).Determine quién/qué reservó 5.5 GB de memoria virtual en w3wp.exe

Este gran trozo de memoria virtual está reservado en el momento en que se inicia el proceso, por lo que no se trata de una "fuga" gradual de memoria de algún tipo.

Algunos husmeando con windbg muestran que la pregunta de memoria es Privada, Reservada y RegionUsageIsVAD, lo que indica que podría ser el trabajo de alguien que llama a VirtualAlloc. También muestra que la memoria en cuestión se asigna/reserva en 4 grandes bloques de 1GB cada uno y varios más pequeños (1/4GB cada uno).

Así que supongo que necesito averiguar quién está llamando VirtualAlloc y reservar toda esta memoria. ¿Cómo puedo hacer eso?

Adjuntar un depurador al proceso antes de la asignación de memoria es complicado, porque w3wp.exe es un proceso iniciado por svchost.exe (es decir, filtro IIS/ASP.Net) y si intento iniciarlo yo mismo en Para depurarlo, simplemente se cierra sin toda esta reserva de memoria profusa. Además, los parámetros de línea de comando no son válidos si los vuelvo a usar (lo cual tiene sentido porque es un conducto creado por el proceso de llamada).

Puedo adjuntar windbg al proceso después del hecho (que es cómo encontré las regiones de memoria en cuestión), pero no estoy seguro de que sea posible en ese momento determinar quién asignó qué.

+1

Solo me gustaría decir "Oh My God"! – StingyJack

+0

Ese es el primer uso relevante de la nueva etiqueta que he visto (¡fuera de las páginas de Heroes en NBC.com, por supuesto)! –

+0

Veo el mismo comportamiento en Server 2008, IIS7 –

Respuesta

7

David Wang answers this to a similar question:

[...] el desa rendimiento ASP.Net por me dice que:

  • La memoria virtual reservada no es nada de qué preocuparse. Puede ver como prerrequisito de rendimiento/almacenamiento en caché del CLR. Y la prueba de carga pesada muestra que no hay nada de qué preocuparse acerca de.
  • System.Windows.Forms - No se ha extraído en la página vacía de mundo ASPX . Puede usar Microsoft Debugging Tools y "sx e ld system.windows.forms" para identificar qué realmente está tirando en el tiempo de ejecución. O puede ildasm para encontrar la dependencia .
  • mscorlib - asegúrese de que está GAC'd y NGen'd correctamente.
3

La memoria virtual es solo el espacio de direcciones asignado al proceso. No tiene nada que ver con el uso de la memoria.

Ver:

  1. Virtual Memory
  2. Pushing the Limits of Windows: Virtual Memory
  3. http://support.microsoft.com/kb/555223
+0

La cantidad de memoria virtual reservada afecta al "Tamaño virtual" del proceso, lo que hace que el reciclaje de procesos en asp.net basado en límites de memoria virtual sea inútil. –

+0

¿Y qué se supone que significa eso? La VM puede aumentar debido a las mayores necesidades de direccionamiento. No estoy seguro si esto se volverá demasiado grande. No puedo probar realmente, solo tengo Vista de 32 bits aquí. Obtendrá un máximo de 3 GB de VM AFAIK, pero solo unos 2 GB de memoria real máxima por proceso. – leppie

0

Reservados memoria es muy diferente del asignado memoria. La reserva de memoria solo asigna espacio de direcciones.No compromete ninguna página física.

Es probable que IIS asigne este espacio de direcciones para su almacenamiento dinámico. Solo comprometerá páginas cuando sea necesario.

Si realmente desea iniciar w3wp.exe desde windbg, probablemente necesite iniciarlo 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 proceso w3wp.exe actual. 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 se ve 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í. Así que definitivamente deberías mirar tu línea de comando antes de lanzar w3wp desde windbg.

+0

Estos argumentos de línea de comandos son únicos y no se pueden reutilizar, lo intenté. –

Cuestiones relacionadas