Cómo explicar el uso de memoria en Windows Server fuera de la lista de procesos en ejecución

9

Tengo un servidor de Windows 2003 que funciona un poco lento, donde la carga de confirmación y el uso del archivo de página aumentan hasta que finalmente reinicio. Para solucionar esto, necesito averiguar qué está consumiendo toda la memoria, y aquí es donde está el gran misterio.

Estadísticas actuales del Administrador de tareas:

Physical Memory (K): 2096400
Commit Charge (K):   5364848
Page file usage:     5.11 GB

Bien, entonces saquemos SysInternals Process Explorer y verifiquemos el tamaño del conjunto de trabajo de todo lo que se está ejecutando. El mayor culpable es una instancia de Tomcat que usa 121,980K WS, 481,284K VM Size. Nada allí se acerca a explicar el cargo de confirmación de 5 GB.

Siguiente paso: SysInternals pslist : pslist -mdivide la salida por columna y calcula sumas de columna para los 61 procesos que se informan.

SUM (Working Set)  : 681,484 K
SUM (Private Bytes): 593,424 K

¿Estoy malentendiendo fundamentalmente lo que informan las herramientas? Siempre he tenido la impresión de que un sistema operativo realmente comprometería mucha menos memoria que la cantidad total de memoria virtual asignada por un proceso, bajo el supuesto de que en realidad nunca usará tanto, y que mirar VM aquí es un arenque rojo

jpdaigle
fuente
1
Actualización: Sí, este sistema está paginado, y con frecuencia recibo la advertencia "Quedando sin memoria virtual". Cada vez que recibo la advertencia, verifico las estadísticas de memoria y no hay ningún proceso que parezca particularmente mal comportamiento, pero la estadística Memoria, Bytes comprometidos siempre supera los 5 GB.
jpdaigle

Respuestas:

1

JP, creo que su comentario de que este es un servidor de prueba de unidad / compilación automatizado que se ejecuta menos que un código estable lo dice todo. Supongo que este servidor debe reiniciarse con frecuencia debido a que el código inestable que se ejecuta en él probablemente tiene pérdidas de memoria que le están dando los síntomas que está viendo. Las pérdidas de memoria no se incluirán en ninguno de los árboles de procesos de los procesos en ejecución, ya que son memorias que son capturadas por procesos que ya no existen y que aún se asignan, a pesar de que el proceso asociado con ellos ya no existe.

Obtenga una ventana de mantenimiento frecuente que le permita reiniciar automáticamente esta máquina, quizás todas las noches, un par de veces a la semana o semanalmente, dependiendo de la velocidad a la que este comportamiento comienza a presentar problemas de rendimiento.

Tenemos servidores de Oracle Application Servers en Windoze hace un tiempo que debían reiniciarse dos veces al día. Echamos a los usuarios a la hora del almuerzo, y en medio de la noche todos los días. Eso fue hace unos años, con un código de producción supuestamente estable de Oracle.

Kevin K
fuente
2

Lamento pegar algunos enlaces, pero hemos estado usando algunas técnicas para encontrar pérdidas de memoria, usando logparser y powershell, así que compartiré.

http://blogs.msdn.com/debuggingtoolbox/archive/2008/08/22/powershell-script-chart-and-statistics-from-top-20-objects-leaking.aspx

(El sitio Never Doubt Thy Debugger es excelente): http://blogs.msdn.com/carloc/archive/2007/09/14/something-you-need-to-know-before-start-debugging.aspx

También proporcionaré un enlace a la excelente visión de Mark Russinovich sobre el uso de memoria en Windows:

http://blogs.technet.com/markrussinovich/search.aspx?q=memory&p=1

Además de abrir casos reales de Microsoft, el sitio de Performance Team también tiene mucha buena información: http://blogs.technet.com/askperf/Default.aspx?p=2

mctsonic
fuente
1

La herramienta principal para ayudar a diagnosticar esto es perfmon. Los contadores que miraría (para empezar) son:

Memoria, Bytes comprometidos esto es una medida de la demanda de memoria virtual
Proceso, Conjunto de trabajo, _Total memoria virtual en uso "activo"
Archivo de paginación,% archivo de página en uso
Memoria, Páginas / seg (esto no es necesariamente un indicador de poca memoria , aunque todos parecen asumir que sí)
Memoria, salida de páginas / seg. cuántas páginas de memoria virtual se escribieron en el archivo de página para liberar marcos de página de RAM para otros fines cada segundo

Memoria, memoria de bytes de
memoria caché, memoria de bytes de paginación no paginada
, memoria de bytes paginada de reserva , memoria de bytes
totales del código del sistema, bytes totales
del controlador del sistema

cuando esta suma se acerque a 2 GB, tendrá problemas de rendimiento, generalmente debido a la arquitectura de 32 bits

Memoria, MBytes disponibles: esto mide la cantidad de RAM disponible para satisfacer las demandas de memoria virtual (ya sea nuevas asignaciones o para restaurar una página desde el archivo de página).

Ver también http://members.shaw.ca/bsanders/WindowsGeneralWeb/RAMVirtualMemoryPageFileEtc.htm

Jim B
fuente
Enlace interesante En este servidor, veo un conjunto de trabajo de proceso total de 640 MB, pero "Memoria, bytes comprometidos" es de 5,4 GB. Ninguno de los otros contadores que mencionas es muy alto. Frecuentemente aparece la advertencia "Quedando sin memoria virtual", por eso estoy investigando. Agregar comentario al OP.
jpdaigle
1

¿Cuánto tiempo lleva funcionando ese servidor desde el último reinicio? Es un hecho desafortunado de la vida que Windows tenga pérdidas de memoria. es decir, la memoria asignada no siempre se devuelve al sistema. Los síntomas son exactamente lo que estás viendo. Si aún no lo haces, te sugiero reiniciar al menos una vez a la semana. Muchos centros de datos reinician Windows todos los días, ya que hacerlo reduce en gran medida las llamadas de soporte. Por supuesto, eso es mucho más fácil de hacer cuando usas clústeres porque no hay tiempo de inactividad.

John Gardeniers
fuente
0

Se dice que hay un administrador de sistemas en algún lugar que realmente entiende las estadísticas de memoria de Windows, pero nunca los he conocido.

Sin embargo, no suele ser demasiado difícil encontrar un proceso que se porta mal. Intente usar Perfmon para ver los diversos contadores de proceso, como los identificadores o los errores de página / segundo.

JR

Reflexiones adicionales: ¿estás seguro de que tienes poca memoria? La clave es si está recibiendo paginación. Si no hay paginación, no tiene poca memoria. Usando PerfMon eche un vistazo al contador Memoria - Páginas / seg.

John Rennie
fuente
No veo nada obvio en los procesos en ejecución. ¿Hay alguna forma posible de que el sistema operativo no recupere la memoria después de que finalice un proceso? Este es un servidor de prueba de unidad / compilación automatizado, por lo que, por supuesto, los procesos se bloquean todo el tiempo, ya que siempre ejecuta compilaciones de última generación creadas automáticamente desde SVN.
jpdaigle
Vea mi edición para algunos pensamientos adicionales
John Rennie
0

Recuerde que el conjunto de trabajo es el bit de memoria que en realidad representa la memoria física REAL. también tiene su carga de memoria virtual, y Windows comparte páginas de códigos, algunos fragmentos de MFC se compartirán entre muchos y muchos procesos sin duplicar el uso de la memoria. Además, tiene un deseo incesante de Windows de mantener el caché del sistema de archivos lo más grande posible (lo he visto aumentar a 800 MB en una computadora portátil de 2.5 GB antes).

La administración de memoria de Windows es muy robusta. Sin embargo, una vez que Windows comienza a paginar, las cosas se ponen feas y SIEMPRE tiene que dejar espacio para la memoria caché del sistema de archivos, siempre siempre siempre. Rutinariamente tengo que apagar y reiniciar Firefox cuando mis más de 80 pestañas controlan su consumo de memoria de hasta 1.2 gb / 1.2 + gb.

Windows también difumina un poco la línea, entre las páginas que están en el caché y las páginas que se enumeran como memoria / conjunto de trabajo.

Chris K
fuente