¿Cómo determino qué aplicación está perdiendo memoria no paginada?

8

Recientemente tuvimos un problema en nuestro servidor en vivo que hizo que nuestra aplicación web dejara de responder. Todo lo que recibimos fueron errores 503 hasta que reiniciamos el servidor, entonces estuvo bien. Finalmente lo rastreé hasta el httperr.log y encontré muchos errores 1_Connections_Refused.

La investigación adicional parecía indicar que habíamos alcanzado el límite de grupo no paginado. Desde entonces, hemos estado monitoreando la memoria del grupo no paginado usando Poolmon.exe y creemos que hemos identificado la etiqueta que está causando el problema.

Tag   Type    Allocs       Frees       Diff       Bytes      Per Alloc
Even  Nonp  51,231,806   50,633,533   684,922   32,878,688      48

Si usamos poolmon.exe / g, muestra el controlador mapeado como [<desconocido> objetos de evento].

Esto no ayuda en absoluto. Mi equipo ha dedicado un tiempo considerable a investigar este problema y no ha podido encontrar un proceso para reducirlo a una aplicación o servicio específico. Tengo la sensación de que la mayoría de las personas parecen resolver el problema eliminando procesos en la máquina hasta que ven el restablecimiento de la memoria no paginada. Esto no es exactamente lo que quiere ver cuando trabaja en una máquina de producción.

Si abro el Administrador de tareas y veo la lista de procesos. Veo MailService.exe con un valor de NP Pool de 105K, esto es 36K más alto que el valor del proceso que aparece en segundo lugar. Como hemos tenido algunos problemas con nuestro servidor de correo en el pasado (que pueden o no estar relacionados con este problema), mi intuición es que esto está causando el problema.

Sin embargo, antes de comenzar a reiniciar los servicios, me gustaría tener un poco más de certeza que solo un "presentimiento".

También he intentado usar poolmon.exe / c pero esto siempre devuelve el error:

unable to load msvcr70.dll/msvcp70.dll

y no crea localtag.txt. Mi colega tuvo que descargar pooltag.txt de Internet porque no podemos averiguar dónde se encuentra. No tenemos instalado el depurador win o el DDK win (que puedo ver). Tal vez el error anterior se da porque no tenemos ninguno de estos instalados, pero no lo sé.

Finalmente probé:

C:\windows\system32\driver\findstr /m /l Even *.sys

Esto devolvió una lista bastante considerable de archivos .sys y nuevamente no fue de ninguna ayuda con el problema en cuestión.

Entonces mi pregunta es esta: ¿Hay alguna otra forma de reducir la causa de esta pérdida de memoria?

ACTUALIZAR:

Como se sugiere a continuación, he estado registrando los Bytes de bloque no paginado durante el último día más o menos para ver si algún proceso está en tendencia. En su mayor parte, todos los procesos parecen ser bastante estáticos en su uso. Dos de ellos parecen haber aumentado ligeramente. Continuaré monitoreando esto durante los próximos días.

También olvidé mencionar antes que ninguno de los procesos parece estar usando un número excesivo de identificadores tampoco.

ACTUALIZACIÓN 2:

He estado monitoreando esto durante las últimas semanas. Tanto el conjunto de bytes no paginado para procesos individuales como el conjunto de bytes no paginado totales se han mantenido relativamente estables durante ese tiempo. Durante este tiempo, Windows se actualizó y el servidor se reinició, así que me pregunto si eso ha resuelto el problema. Definitivamente no estoy viendo el crecimiento constante en el conjunto de bytes no paginado ahora que estaba antes de esto.

Desarrollador
fuente
¿Por qué no utilizar perfmon para monitorear Bytes de bloque no paginado para todos los procesos y buscar el proceso con memoria de bloque no paginado fugitivo?
joeqwerty
Acabo de jugar un poco con el Monitor de rendimiento y lo configuré para que haga lo que me sugirió. Sin embargo, en realidad no me dice nada que no supiera al mirar el Administrador de tareas. MailService tiene el uso más alto de Pool no paginado pero solo es de 106K. Entonces no es exactamente la pistola humeante que estaba buscando.
Desarrollador
Busque el aumento de bytes de bloque no paginado en los procesos a lo largo del tiempo. Es posible que no se vea fácilmente al tomar una vista rápida del uso por proceso en cualquier momento. Puede capturar fácilmente el uso a lo largo del tiempo configurando un registro de contador para guardarlo en un archivo CSV y abrirlo con Excel para analizar el uso creciente por proceso. Cualquier proceso que exhibe un aumento del 10% o más en bloque no paginado Bytes desde el inicio del sistema se está escapando memoria y es probable que el proceso que causa el problema
joeqwerty
Una herramienta útil para ayudar a capturar y analizar los datos de contador relevantes es la herramienta PAL, que se encuentra aquí: pal.codeplex.com/releases/view/51623#ReviewsAnchor . Esta es una versión más nueva que la que he usado, pero hay una versión x86 y parece que se puede usar en W2K3.
joeqwerty 01 de
He configurado un archivo de registro para registrar los bytes de agrupación de NP. Poolmon ahora dice que mi uso de memoria no paginada es de 68 MB. Ha crecido unos 2-3 MB en las dos horas que he estado tratando de resolver esto. Pero no hay un crecimiento correspondiente (que puedo ver) en los valores de NP para los procesos. De hecho, los valores de NP Pool contra los procesos individuales no están cerca de este número. Incluso si agregué todos los valores de grupo de np enumerados, el total sería de 1 MB, no de 68 MB. Pero tal vez me estoy perdiendo algo aquí.
Desarrollador

Respuestas:

6

He estado monitoreando esto durante aproximadamente 6-7 semanas y finalmente puedo dar una respuesta definitiva al problema.

En primer lugar, los bytes no paginados para procesos individuales realmente no me dijeron nada útil, ya que todos parecían ser bastante estáticos en su uso. Hubo picos, pero el uso siempre volvió a la línea de base después.

El total de la memoria de bytes no paginados también fue estático durante un tiempo, pero luego comenzó a aumentar gradualmente y luego a aumentar. Después de un pico, aproximadamente la mitad de la memoria se liberó y luego permaneció estática nuevamente (en el nivel superior) por un tiempo hasta que se repitió el patrón. Al mirar el gráfico, noté que estos picos parecían estar espaciados con bastante regularidad y resulta que ocurrían con 2 semanas de diferencia y siempre un domingo.

Entonces, la siguiente pregunta fue: ¿Qué se ejecuta los domingos cada dos semanas? Fui a ver el Visor de eventos y cada vez que se producía un pico, McAfee se estaba ejecutando . También creo que al iniciar sesión en el servidor con frecuencia para monitorear el problema, sin darse cuenta empeoramos el problema porque McAfee tiene un escáner en tiempo real y creo que esto estaba causando los aumentos más pequeños que estábamos viendo.

Creo que los escaneos que se están programando para las tareas también explican por qué vimos los aumentos de memoria NP adjuntos a la etiqueta de objetos de evento en PoolMon en lugar de la etiqueta específica de McAfee. Esto fue lo principal que realmente nos llevó por el camino del jardín.

Ahora que finalmente sabemos qué está causando las fugas, podemos hacer algo al respecto. Sin embargo, es increíble que haya tomado tanto tiempo rastrearlo.

ACTUALIZACIÓN : Solo como una nota final. McAfee se actualizó el fin de semana y esto resolvió por completo nuestro problema de memoria no paginada.

ACTUALIZACIÓN 2 : dado que acabo de recibir un voto positivo para esto, agregaré una actualización adicional a esto. Inicialmente, la actualización de McAfee parecía solucionar nuestro problema, es decir, ya no vemos los picos masivos en la memoria NP a intervalos regulares. También he notado que desde la actualización, parece que McAfee ya no escribe registros en el Visor de eventos de forma predeterminada, lo que se oculta cuando está escaneando activamente.

Pero todavía estamos viendo aumentos graduales en el uso de la memoria NP. Llegó al punto en el que ahora necesitamos reiniciar nuestro servidor cada 2 semanas más o menos. Es tan malo que recientemente adquirimos un nuevo servidor con la esperanza de que el hardware y el software actualizados solucionen este problema, PERO nuestro servidor completamente nuevo con solo Windows Server 2008, SQL Server 2008 R2 y McAfee instalado todavía SIGUE mostrando una pérdida de memoria NP . Fue solo después de que eliminé por completo McAfee que la fuga se detuvo y permaneció estática incluso después de configurar el servidor con todo nuestro software en preparación para cambiarlo.

Desde entonces, he leído, y no sé si esto es cierto, que el problema no es con McAfee, sino con alguna rutina de Windows que McAfee usa y que hace que se pierda la memoria NP. Aparentemente, la actividad de la red es la causa de la fuga, es decir, más actividad de la red => fugas más grandes. Esto parece ser consistente con nuestra experiencia, ya que la fuga ha empeorado a medida que nuestro servidor se ha vuelto más ocupado.

Desarrollador
fuente