Diagnosticando Memoria Virtual con Powershell

¿Que es la memoria virtual?

Sin entrar en muchos detalles, Windows le presenta a cada proceso que esta corriendo, un espacio virtual con el que trabajar dependiendo de la arquitectura (x86 o x64). Cada proceso cree que tiene mucho espacio y trabaja tranquilo, pero lo único que se escribe en RAM es lo que realmente esta usando, permitiendo una mejor administración de recursos. A veces, incluso, Windows usa archivos en el disco (paging files) para administrar la memoria. Hay ciertas confusiones con respecto al Paging File. La mas clara es que el Paging file se comienza a usar cuando el equipo se queda sin RAM. Eso simplemente no es así. Por ejemplo, si abrimos un archivo de texto y lo modificamos, ese archivo estará en el Paging File hasta que guardemos los cambios a disco.
En otros artículos estaré dando detalles de como medir la performance de nuestros equipos y como configurar correctamente los paging files. Si quiere mas información sobre memoria virtual, por favor, vayan a la fuente y lean: https://blogs.technet.microsoft.com/markrussinovich/2008/11/17/pushing-the-limits-of-windows-virtual-memory/

Agotamiento

Las causas del agotamiento de memoria virtual pueden variar, pero generalmente se dan cuando un proceso usa la memoria mientras esta activo y no la devuelve al sistema cuando pasa a la inactividad. Este proceso se conoce como memory leak y a medida que va llenando su espacio virtual, también lo hace realmente en su espacio “físico”, entonces no deja lugar para otros procesos, causando problemas de performance e incluso puede llegar a colgar el equipo. Otra causa puede ser muchas (demasiadas) instancias de una aplicación corriendo al mismo tiempo, por lo que el Sistema Operativo no llega a tiempo para cumplir con todos los requisitos. Esto se da generalmente cuando una aplicación no esta bien configurada. Suele pasar mucho con aplicaciones web.

En muchos casos, Windows se da cuenta de esta situación y logra escribir un Evento en el Log ‘Microsoft-Windows-Resource-Exhaustion-Detector/Operational’. De todos los eventos que pueden registrarse en ese Log, el que mas ayuda es el ID 2004 ‘Windows successfully diagnosed a low virtual memory condition…’. El mensaje completo de estos eventos nos permite ver exactamente cuales eran los 3 procesos que mas consumían memoria virtual y que posiblemente mas hayan contribuido en el agotamiento del espacio y los problemas de performance del equipo.

En este articulo, vamos a ver como trabajar con este tipo de eventos y como acomodar y usar la información que nos proveen.

Usando Get-WinEvent

Get-WinEvent es la forma correcta de trabajar con cualquier Log de Windows. Mientras Get-Eventlog puede parece un poco mas fácil de usar al principio, tiene limitaciones. La mas clara es que solo se puede usar Get-EventLog para filtrar eventos de System, Application y Seciurity Logs. Todos los demas Logs que nos presenta el Sistema Operativo (a partir de Windows Vista/2008), solo pueden ser accedidos con Get-WinEvent. Otra ventaja es poder usar hashtables y archivos xml y para filtrar y buscar eventos.
Por esta vez, usaremos Hashtables para definir nuestra búsqueda. Podemos elegir entre los siguientes campos de los eventos: LogName, ProviderName, Path, Keywords, ID, Level, StartTime, EndTime, UserID, Data, *.

Preparando el reporte

Lo bueno de Powershell es que se adapta a la forma de trabajar de cada uno. A mi por ejemplo, me gusta ir armando pequeños reportes y mostrar los resultados en pantalla y luego elegir que información va a parar a un archivo de texto para posterior análisis. No digo que sea la mejor forma de hacer las cosas, solo que es lo que mejor me funciona a mi en este caso.

Armemos una pequeña función entonces, que nos traiga, los últimos 5 eventos (numero arbitrario) con ID 2004, que son los que nos interesan:

get-exhaustevent

Analicemos un extracto del output. Tengan en cuenta que por cuestiones legales y de seguridad, tuve que cambiar el nombre de los equipos, pero sepan que estos ejemplos son tomados de servers en producción.

extracto

En este caso, vamos a centrar la atención en el Server902. Si se fijan bien, el primer proceso en el primero evento de los 5 que muestro aquí, se llama kntcma.exe y fue en ese momento el mayor contribuyente al agotamiento de memoria virtual el día 24 de Enero de 2016 a las 17:35 (quizás sea bueno corroborar si sus herramientas de monitoreo / tickets capturaron este evento también. El reporte nos informa cuantos bytes de memoria virtual este proceso estaba consumiendo: 64976850944 bytes… 60GB!! impresionante, no?

Lo interesante aquí es saber que este servidor tiene 128 GB de RAM, así que es un server bastante grande; pero ¿porque este proceso esta consumiendo tanto? ¿Que es este proceso? ¿Es este comportamiento normal?

Buscando un poco, descubro que es un proceso de un software de monitoreo. Lo que es mas, un articulo explica que este proceso tiene un memory leak conocido y nos da una solución que es simplemente parchear el producto con la instalación de un Fix.

“Large amounts of memory can be consumed quickly, or memory use may grow over time indicating a memory leak against the kntcma.exe process.”
“Grandes cantidades de memoria pueden ser consumidas rápidamente, o el uso de memoria puede crecer a medida que pasa el tiempo indicando un memory leak del proceso kntcma.exe”

http://www-01.ibm.com/support/docview.wss?uid=swg1IV27944

Volviendo a lo nuestro. Una vez que tengo todo el output de mis servers, lo único que hago es guardar lo que esta en pantalla en un archivo de texto para su posterior procesamiento y análisis, y en donde voy a poder sacar información interesante.
Luego, me queda armar algunas pequeñas funciones que me ayuden a obtener los datos.

scripts

En estos ejemplos vemos como simplemente dividiendo los reportes, podemos sacar información de la fecha en que se generaron los eventos o cual fue el proceso que mas consumía memoria en cada evento. A partir de aquí, queda en la creatividad de cada uno y cuanta información logran obtener de su ambiente para solucionar problemas de memoria virtual.

Por ejemplo: Queremos ver cuantos eventos ocurrieron en lo que va del año y queremos saber el momento en que ocurrieron:

date

O queremos saber cuantos servidores contienen eventos que están relacionados a un proceso en particular que estemos investigando:

Genial toda la información y todo lo que podemos hacer con tan solo armar pequeñas funciones que nos hagan el trabajo mas sencillo. Imagínense tener que chequear estos eventos en 100, 200 o 1300 servidores uno por uno… imposible.

Espero que les sirva y que se animen a armar funciones que les ayuden a diagnosticar problemas de todo tipo.

Saludos, Mauro.

Leave a Reply

Be the First to Comment!

Notify of
avatar
wpDiscuz