¿Por qué el uso total de RAM del Resource Monitor y el Administrador de tareas ni siquiera se suman de forma remota al uso total de la memoria física? [duplicar]

30

He notado esto en muchas máquinas Windows diferentes, en muchas ocasiones diferentes: el uso de RAM informado por el Administrador de tareas o el Monitor de recursos a menudo parece sumar una cantidad que es significativamente menor que la cantidad real en uso.

Por ejemplo, muchas veces en mi computadora portátil o en mi computadora de escritorio, he visto algo como 7GB en uso, y sin embargo, el total del conjunto de RAM de trabajo es más parecido a 3GB. ¡No puedo entender dónde se está usando!

Aquí hay un ejemplo extremo que noté hoy en Resource Monitor en un servidor:

Monitor de recursos
Haga clic para tamaño completo

Si hace clic con el botón derecho en la imagen y se abre en una nueva pestaña, y ve los números, notará que el Conjunto de trabajo (que no incluye memoria virtual no física) suma aproximadamente 1.7GB. Obtengo números similares al agregar el uso de RAM en el Administrador de tareas cuando se habilita "Mostrar procesos de todos los usuarios".

Ahora aquí hay una captura de pantalla de la pestaña Rendimiento del administrador de tareas:

Administrador de tareas
Haga clic para tamaño completo

Esto dice que se usan 7,6 GB de memoria física.

Lo veo todo el tiempo, en computadoras personales, computadoras portátiles y ahora en servidores: el uso total de RAM informado por las herramientas del sistema solo representa aproximadamente 1/4 del uso de RAM que observo. ¿¿¿Que diablos está pasando???

¿Hay alguna explicación satisfactoria de dónde está toda mi RAM? ¿Qué lo engulle y por qué no deja rastro?

EDITAR: Aquí hay una imagen del uso gráfico de RAM, como lo solicitó el usuario:

Uso de RamMap
Haga clic para tamaño completo

EDITAR 2: en respuesta a la respuesta de James, aquí hay una imagen de los procesos no paginados poolmon.exe, ordenados por tamaño:

ingrese la descripción de la imagen aquí

Estos resultados me confunden. poolmonindica correctamente que tengo 6 GB de grupo no paginado en uso, pero todos los procesos de grupo no paginado tienen un tamaño inferior a 8 MB.

¿Qué podría significar esto? ¿No se poolmondetectan algunos de los procesos que usan el grupo no paginado?

ContenedorDoofus
fuente
¿Puede publicar una imagen de su monitor de recursos> pestaña Memoria (solo la parte inferior con los colores y números). Eso sería más revelador.
whs
2
@Ramhound: ¡Gracias por señalarme ese enlace! Desafortunadamente, tal como lo solicité recientemente, he subido una imagen del mapa gráfico de la memoria física del Monitor de recursos, y la porción en espera de la memoria física es menos del 2% del uso total de RAM. La respuesta de David Schwartz sugiere que el uso de RAM "oculta" proviene de la RAM en espera (es decir, la RAM utilizada para datos en caché y código no en uso), y ese no es el caso aquí. Como tal, no creo que la respuesta de David explique lo que está sucediendo.
DumpsterDoofus
Usa el programa RamMap y explora con él más. ¿Hasta ahora podría ser un conductor loco? pero de hecho no es el modo de espera (caché). ¿Ejecutas algún programa especial que permita arreglar el RAM o que suponga acelerar la computadora? ¿Algún elemento de controlador extraño que sea especial para sus computadoras?
Psycogeek
2
El enlace al "respondido antes" no cubre este caso.
Jamie Hanrahan

Respuestas:

30

Lo siento, sé que esto suena como una respuesta frívola ... pero la respuesta a la pregunta en su título es "porque no se supone que lo hagan".

O para decirlo de manera más cortés: se usa mucho la RAM que no está en los conjuntos de trabajo privados de los procesos. Parte de esto está en los conjuntos de trabajo compartidos de los procesos, pero no se puede obtener una noción confiable del uso real allí, debido al uso compartido; Sumar los números de los procesos le dará un resultado demasiado grande.

Otras cosas que ocupan RAM, como el grupo no paginado, la parte residente del grupo paginado y las partes residentes de otros usos del espacio del núcleo, no se muestran en absoluto en la pantalla de "procesos" del Administrador de tareas.

Con respecto a su problema específico:

En la pantalla del Administrador de tareas, consulte la sección "memoria del núcleo". Tiene 6 GB de "memoria no paginada" (es decir, grupo no paginado). Eso es parte de la sección "En uso" en su segundo gráfico. El grupo no paginado no se carga a ningún proceso, por lo que sumar los números por proceso en el administrador de tareas no se acerca al total en uso. Es probable que algún controlador lo esté usando. Esta es una cantidad totalmente excesiva; debería estar por debajo de 1 GB. cualquier controlador responsable de la parte excesiva del uso de la agrupación no paginada es indudablemente defectuoso.

RAMmap puede confirmar esto (en su pestaña "Usar recuentos", mire el total de "Grupo no paginado") pero no puede ayudarlo a encontrar qué controlador lo está causando.

Aquí se explica cómo encontrarlo: obtenga una copia de la herramienta de Microsoft "poolmon". Es una herramienta en modo personaje (chico, lo es) distribuida con el Kit de controladores de Windows. Para Windows 7, el WDK es una descarga gratuita . Tienes que descargar todo (es un ISO) e instalarlo desde allí, pero puedes elegir instalar solo las herramientas, si eso es todo lo que quieres.

Busque poolmon en los directorios WDK, asegúrese de elegir el correcto, de 32 o 64 bits, y ejecútelo desde el símbolo del sistema del administrador. Obtendrá una pantalla como esta:

ingrese la descripción de la imagen aquí

Ahora, presione la tecla "p" (no, no estoy bromeando. ¡No hay menús aquí!) Hasta que la columna "Tipo" muestre solo "Nonp". Luego presione "b" (dos veces si es necesario) para ordenar la pantalla en orden descendente por la columna Bytes (que ya se hizo en la muestra aquí).

Luego mire la columna "Etiqueta" para la línea superior. En el caso (obviamente artificial) que se muestra aquí es "Fuga". (Este sistema está ejecutando un controlador que fue molestado deliberadamente para causar este problema, es un grupo no paginado "con fugas").

por cierto, las líneas resaltadas son las que han cambiado desde la actualización anterior de esta pantalla arcaica.

Ahora busque en c: \ Windows \ System32 \ Drivers un archivo .sys que contenga esa cadena. En este caso, estaría buscando "Fuga", así:

c:\windows\system32> findstr /s Leak *.sys

Luego busque en la web referencias a esa cadena y / o ese nombre de controlador.

También sería útil regresar aquí e informar el nombre completo, el nombre del fabricante, etc. del archivo .sys.

(Mi apuesta es que la etiqueta que encuentre será ECMC, el controlador es intmsd.sys y está asociado con un producto llamado ExpressCache o IntelliMemory. "Desinstalaría" ese producto. Hay una actualización para solucionar el problema, pero incluso con la versión fija, nunca he visto mejorar el rendimiento de un sistema con este producto; esencialmente duplica la funcionalidad que ya está en Windows).

Si no puede encontrarlo de esa manera, el siguiente paso es usar el "Kit de herramientas de rendimiento de Windows". Busque en este foro esa cadena, con respuestas de magicandre1981, para obtener instrucciones. Ignora las respuestas que mencionan xperf: es una versión anterior de la herramienta.

ACTUALIZACIÓN: Según los comentarios, el OP hizo lo anterior y descubrió que, aunque poolmon informó que el tamaño total del grupo no paginado era realmente enorme, todas las piezas asignadas eran aparentemente pequeñas. Mi conjetura (también en los comentarios) es que esto se debe a lo que llamaré agrupación "hinchada": la agrupación se asignó, luego se liberó, pero por alguna razón esa cantidad de RAM asignada a la agrupación no se redujo para reflejar la "liberación" . Seguir el procedimiento descrito en esta respuesta por magicandre puede identificar al culpable.

Jamie Hanrahan
fuente
¡Gracias por investigar más que otros! Buscaré una fuga usando poolmonhoy si tengo tiempo, e intentaré leer tu respuesta más de cerca para asegurarme de que la entiendo. ¿Estás diciendo que probablemente hay una pérdida de memoria? Si es así, eso es totalmente plausible, ya que estamos trabajando en un software que tiene fugas de memoria horribles.
DumpsterDoofus
@DumpsterDoofus: Sí. Probablemente hay una pérdida de memoria en un controlador de modo kernel. Esto es diferente de una pérdida de memoria en una aplicación.
Jamie Hanrahan
Así que finalmente pude ejecutar poolmon.exeel servidor en cuestión y edité mi pregunta para incluir una captura de pantalla. poolmonafirma que tengo un grupo no paginado de 6GB (como señaló en mi captura de pantalla del Administrador de tareas), pero cuando miro solo los procesos "Nonp" y los ordeno por tamaño, todos son pequeños (el mayor es 8MB). ¿Tiene alguna idea de por qué poolmonno se detecta la mayor parte del uso del grupo no paginado?
DumpsterDoofus
2
Ah ... el problema aquí está en la palabra "uso". Por lo tanto, tiene un grupo no paginado de 6 GB, pero parece que solo una fracción está en uso en este momento. Lamentablemente, nada de lo que sé (ni TM, ni poolmon, ni RAMmap) muestra cuánto de la agrupación está realmente en uso. Supongo que hubo un usuario de grupo pesado al mismo tiempo, por lo que el grupo se expandió para acomodarlo, y luego el usuario pesado se fue. Debido a la forma en que se maneja el grupo, no es fácil liberar la RAM una vez que se le asignó, a menos que la asignación estuviera en grandes bloques contiguos. Sugeriría ver esto después de un nuevo inicio del sistema.
Jamie Hanrahan
Hay una versión de poolmon.exe disponible en las Herramientas de soporte para Server 2003 ( serverfault.com/questions/84479/… ), un poco antigua, pero es solo una descarga de 5,2 MB y aún se ejecuta en (al menos) Server 2016.
mwfearnley