Interioridades de la memoria de Windows (parte 2) — El ciclo de vida de la página física: las cinco listas y la verdad sobre el archivo de paginación
· Actualizado el: · Go Komura · Windows, Gestión de memoria, Archivo de paginación, Working Set, Standby, RAMMap, Supervisión del rendimiento
En la entrega anterior, «Interioridades de la memoria de Windows (parte 1) — El instante en que una dirección virtual se convierte en RAM física», seguimos el proceso hasta el momento en que el manejador de errores de página asigna una página física al tocar por primera vez una página con Commit. Pero, ¿adónde va esa página física una vez que sale del Working Set?
Es habitual encontrar explicaciones que se conforman con decir «se expulsa al archivo de paginación», pero en realidad existen varios estados antes y después de eso. Una página que no ha sido modificada puede pasar a Standby conservando su contenido. Una página modificada primero espera en Modified a que se la vuelva a escribir. Al reutilizarse, puede pasar por Free o Zeroed, y si el mismo contenido vuelve a necesitarse, incluso puede recuperarse desde Standby mediante un error de página leve (soft fault).
En este artículo, tomando como eje la base de datos PFN, seguimos cómo se mueve una sola página física entre Active, Modified, Standby, Free y Zeroed. Damos por supuesta la forma de leer las cifras que se explicó en el artículo introductorio «¿Qué representa realmente el “uso de memoria” de Windows?».
La serie completa “Interioridades de la memoria de Windows” (3 partes)
- Parte 1: Direcciones virtuales y errores de página
Seguimos el momento en que una página virtual con Commit obtiene RAM física. - Parte 2 (este artículo): El ciclo de vida de la página física
Seguimos la transición de estados de una página que sale del Working Set y el papel del archivo de paginación. - Parte 3: Objetos de sección y copy-on-write
Seguimos cómo las DLL, las asignaciones de archivos y la memoria compartida comparten páginas físicas.
La pregunta que responde esta segunda entrega es una sola:
Cuando una página física sale del Working Set, ¿desaparece, va al disco o permanece en la RAM?
El público objetivo son desarrolladores y responsables de operaciones que quieren entender, desde su funcionamiento interno, por qué hay mucho Available y a la vez mucho Standby, el comportamiento tras el recorte del Working Set, la configuración del archivo de paginación y la compresión de memoria. El entorno previsto es Windows 10/11 o una versión actual de Windows Server, y los conocimientos previos son los fundamentos de Working Set, Commit y los errores de página leves/graves (soft/hard fault). El nivel es intermedio: se usan términos internos como PFN y listas de páginas, pero el foco está en lo que se puede observar con RAMMap y PerfMon, sin necesidad de un depurador de kernel.
1. Conclusión inicial
Antes que nada, resumimos los puntos que suelen malinterpretarse.
- Una página que sale del Working Set no necesariamente desaparece de inmediato.
Una página limpia (clean) permanece en Standby, y si vuelve a necesitarse el mismo contenido, puede recuperarse sin leer del disco. - Una página modificada no puede reutilizarse de inmediato.
Si el contenido es privado, se lleva a un estado en el que puede escribirse de vuelta en el archivo de paginación; si es un archivo mapeado, en el archivo correspondiente, y solo entonces se reutiliza. - Available incluye Standby.
Standby es a la vez una caché que conserva contenido y un candidato a reutilización que puede arrebatarse de inmediato si es necesario.1 - La escritura en el archivo de paginación no es un proceso masivo que empieza cuando la RAM se agota por completo.
Avanza en segundo plano según la lista Modified y la presión de memoria.23 - El archivo de paginación no es solo “RAM lenta”.
Amplía el Commit Limit, sirve de respaldo para las páginas privadas modificadas y sostiene el volcado de memoria en caso de fallo.4 - Deshabilitar el archivo de paginación no corrige las fugas de memoria.
Reduce el Commit Limit y puede disminuir tanto las opciones para aprovechar la RAM eficientemente como la capacidad de obtener volcados de memoria.
Resumido en una frase: antes de descartar una página, Windows comprueba la probabilidad de que vuelva a necesitarse y el lugar desde el que puede restaurarse su contenido original.
2. La base de datos PFN — el libro de registro del lado de la RAM física
En la primera entrega vimos que la PTE representa la traducción de una página virtual a una página física. Vista ahora desde el lado de la página física, la base de datos PFN es el libro de registro que hace seguimiento de «para qué se usa en este momento esta página de RAM». PFN son las siglas de Page Frame Number, es decir, la numeración de la RAM física por unidades de página.
Conceptualmente, cada entrada PFN hace seguimiento de la siguiente información:
- Estado actual de la página física
- Número de referencias y de recursos compartidos
- La PTE correspondiente
- Si ha sido modificada o no
- A qué lista de páginas pertenece
- Información relacionada con el nodo NUMA y la prioridad
En WinDbg, !pfn muestra la información de un PFN concreto y !memusage muestra el estado de uso de la memoria física y el resumen de cada lista de páginas.56 Si desea observar el mismo panorama sin usar un depurador de kernel, puede recurrir a RAMMap, de Sysinternals. En Use Counts se ve el uso y la lista de páginas, en Priority Summary el Standby desglosado por prioridad, y en Physical Pages el uso por página individual.7
3. Cómo se conectan los cinco estados en un solo diagrama
En este artículo simplificamos el flujo de la página física a los siguientes cinco estados. Para ser estrictos, el Windows actual tiene estados y listas que no se representan aquí, como el Standby desglosado por prioridad, Transition o Bad, y Active tampoco es tanto una única «lista Active» como un estado en el que la página está siendo referenciada, por ejemplo desde el Working Set, a través de una PTE válida. Aun así, este esquema resulta suficiente para interpretar el comportamiento de memoria de una aplicación.
Figura 1: Una página referenciada desde el Working Set pasa a Standby si está limpia (clean) o a Modified si está modificada (dirty). Si vuelve a necesitarse el mismo contenido, se recupera; si es para otro fin, se reutiliza directamente o pasa por Free/Zeroed en previsión de una asignación que requiera ceros.
Código fuente Mermaid de la figura 1
```text flowchart LR zeroed["Zeroed\nCon ceros"] -->|Primer Touch| active["Active / Valid\nReferenciada desde el Working Set"] active -->|Recorta clean| standby["Standby\nCandidata a reutilización con contenido"] active -->|Recorta dirty| modified["Modified\nEsperando escritura de vuelta"] modified -->|Escritura completada| standby standby -->|Recupera por soft fault| active standby -->|Descarta identidad anterior| free["Free\nSin poner a cero"] standby -->|Reutiliza directamente para otro fin| active free -->|Para asignación que requiere ceros| zeroed ```Lo más importante de este esquema es que salir del Working Set y perder el contenido no son lo mismo. Además, cuando se arrebata una página de Standby para otro fin, no siempre se pasa en orden por Free/Zeroed. Si se va a entregar como una nueva página privada de demanda cero al modo usuario, es necesario borrar el contenido anterior, pero si el uso implica sobrescribir toda la página, como al ser destino de una lectura de contenido de archivo, basta con quitar la identidad de Standby y reutilizarla directamente.
4. Active / Valid — la página física a la que se puede acceder ahora mismo
Una página Active/Valid está referenciada desde el Working Set de un proceso o desde el espacio del sistema a través de una PTE válida. La CPU puede alcanzarla mediante la traducción de direcciones normal, por lo que ese acceso en sí no requiere un error de página.
Sin embargo, no hay garantía de que una página permanezca Active. Para mantener la memoria disponible, el administrador de memoria observa el tamaño del Working Set y el uso reciente de cada página, y recorta las candidatas. La documentación de Microsoft sobre Working Set también explica que el administrador de memoria elimina páginas del Working Set para generar memoria disponible.8
4.1. Recortar no es liberar
Lo que cambia con el recorte del Working Set es, principalmente, solo el estado residente al que se puede acceder ahora mismo mediante una PTE válida. Distinga los cuatro puntos siguientes como sucesos independientes:
- Sacar de Working Set
- Liberar el Commit
- Liberar el rango de direcciones virtuales
- Perder los datos originales
Ejecutar EmptyWorkingSet o la opción «Trim Working Set» de alguna herramienta no sustituye a VirtualFree ni a la liberación del heap. Si se vuelve a tocar la misma página, esta regresa mediante un error de página leve (soft fault) desde Standby o un error de página grave (hard fault) desde el respaldo. Por lo tanto, haber «reducido el Working Set» no significa haber «corregido una fuga».
5. Las páginas limpias (clean) van a Standby
Aunque una página salga del Working Set, si su contenido es igual al del archivo original o ya cuenta con un respaldo seguro, puede colocarse en Standby. Los ejemplos representativos son los siguientes:
- Código de EXE/DLL sin modificar
- Archivos mapeados en memoria sin modificar
- Páginas privadas ya escritas de vuelta
- Datos que permanecen en la caché de archivos
Una página en Standby conserva la correspondencia con su contenido anterior. Cuando el mismo proceso u otro proceso necesita ese contenido, si todavía no se ha reutilizado, puede recuperarse con solo un error de página leve que reconecte la PTE.
Por otro lado, si otra asignación necesita una página física, puede descartarse la identidad anterior de Standby y reutilizarla. Si el destino de reutilización es una página privada de modo usuario que requiere inicialización a cero, se prepara mediante Zeroed; pero si el uso sobrescribe toda la página, como con contenido de archivo, puede reasignarse directamente sin ponerla a cero.
Esta doble naturaleza es precisamente la razón por la que Standby es a la vez una caché y parte de Available.
5.1. Por qué Standby forma parte de Available
MEMORYSTATUSEX.ullAvailPhys representa la memoria física que puede reutilizarse de inmediato sin escribir en disco, y es la suma de Standby, Free y Zeroed.1
flowchart LR
accTitle: Las tres listas de páginas que componen Available
accDescr: La memoria física disponible es la suma de Standby, Free y Zeroed, y no incluye las páginas Active referenciadas desde el Working Set
standby["Standby (candidata a reutilización con contenido)"] --> avail["Available (memoria física disponible)"]
free["Free (espacio libre sin poner a cero)"] --> avail
zeroed["Zeroed (espacio libre con ceros)"] --> avail
active["Active (referenciada desde el Working Set)"] -.->|No incluida| avail
Figura 2: Available es la suma de Standby, Free y Zeroed. Incluso Standby, que conserva su contenido, se cuenta como “disponible”.
Por eso no hay contradicción en que el Administrador de tareas muestre «Free es bajo, pero Cached/Standby es alto y Available es suficiente». Windows no deja la RAM libre sin más: conserva en Standby los archivos y el código usados recientemente para reutilizarlos rápidamente como caché cuando hace falta, y los arrebata cuando se necesitan para otro fin.
No concluya que hay escasez de memoria solo porque Free es bajo: observe en conjunto Available, Commit, los errores de página graves y la latencia de procesamiento.
6. Las páginas modificadas (dirty) esperan en Modified
Cuando una aplicación escribe en una página, su contenido deja de coincidir con el del respaldo original. Si esta página modificada (dirty) se sobrescribiera tal cual para otro fin, se perderían los datos. Por eso, una página modificada que sale del Working Set espera en Modified a que se la escriba de vuelta.
El destino de la escritura de vuelta varía según el tipo de página.
| Tipo de página | Destino habitual de la escritura de vuelta |
|---|---|
| Página privada con Commit | Archivo de paginación |
| Archivo mapeado con permiso de escritura | El archivo de datos correspondiente |
| Datos dirty de la caché de archivos | El archivo de datos correspondiente |
| Página de EXE/DLL limpia (clean) | No requiere escritura de vuelta. Puede volver a leerse desde la imagen original |
La documentación de Microsoft sobre el archivo de paginación también explica que los archivos .dll, .exe y los archivos normales que ya existen en disco no necesitan volver a escribirse en el archivo de paginación, y que son precisamente los datos modificados que no tienen una copia original en disco los que se convierten en candidatos para el archivo de paginación.2
6.1. Modified Page Writer
Modified Page Writer es un trabajador del sistema que recorre las páginas dirty respaldadas por el archivo de paginación que rastrea el administrador de memoria, y las escribe en el archivo de paginación.3 En el lado de los archivos mapeados existe una ruta como Mapped Page Writer, que coordina con el sistema de archivos y el administrador de caché para escribir de vuelta en el archivo correspondiente.
Lo importante aquí es que la escritura no funciona con el criterio de «no hacer nada hasta que la RAM llegue a 0 bytes». Windows prepara en segundo plano, según el estado de la lista Modified, de Available y del archivo de paginación, las páginas que podrán reutilizarse en el futuro. Una vez terminada la escritura de vuelta, si no queda ninguna otra referencia válida, la página puede avanzar a Standby conservando su contenido.
flowchart TB
accTitle: Ruta de escritura de vuelta de las páginas modificadas
accDescr: Una página modificada que sale del Working Set espera en la lista Modified. Si es privada y hay un archivo de paginación configurado, Modified Page Writer la escribe en el archivo de paginación, y si es de un archivo mapeado, Mapped Page Writer u otra ruta la escribe en el archivo de datos correspondiente. Tras completarse, la página pasa a Standby conservando su contenido
dirty["Página modificada que sale del Working Set"] --> modified["Espera en la lista Modified a ser escrita de vuelta"]
modified -->|"Página privada (con archivo de paginación configurado)"| mpw["Modified Page Writer la escribe en el archivo de paginación"]
modified -->|Página de archivo mapeado| mapped["Mapped Page Writer u otro la escribe en el archivo correspondiente"]
mpw --> standby["Tras completar la escritura, pasa a Standby conservando el contenido"]
mapped --> standby
Figura 3: El destino de la escritura de vuelta lo determina el tipo de página, y ambas rutas avanzan en segundo plano. En un sistema con el archivo de paginación deshabilitado, no existe destino de escritura para las páginas privadas, por lo que las páginas privadas modificadas permanecen en la RAM.
6.2. Distinguir la salida de páginas de la E/S propia del archivo de paginación
Los siguientes contadores suelen confundirse, así que conviene aclarar su significado.
Memory\\Page Writes/sec: número de operaciones de E/S de escritura de paginación emitidas para liberar memoria físicaMemory\\Pages Output/sec: número de páginas enviadas a disco mediante esas escriturasMemory\\Page Reads/sec: número de operaciones de E/S de lectura de disco emitidas para resolver errores de página gravesMemory\\Pages Input/sec: número de páginas que entraron en la RAM mediante esas lecturas
Conviene tener presente que Page Writes/sec y Pages Output/sec no son contadores que identifiquen exclusivamente el archivo de paginación: también pueden incrementarse por rutas que escriben de vuelta páginas dirty respaldadas por archivos, como los archivos mapeados. A la inversa, el lado de entrada tampoco distingue entre el archivo de paginación, las DLL, los EXE y los archivos mapeados en memoria.2 Si desea identificar la E/S específica de pagefile.sys, no la estime solo a partir de estos cuatro contadores: registre File I/O y Disk I/O con ETW/WPA y correlacione FileObject con FileName para confirmar el archivo implicado.9
Cabe añadir además que haber escrito antes en el archivo de paginación no implica que vaya a leerse de vuelta del disco de inmediato. Si no se accede a ella, la página ya escrita puede sacarse de la RAM, liberando memoria física para páginas de uso más frecuente.
7. Diferencias entre Standby, Free y Zeroed
7.1. Standby
Es el estado en el que se conserva la correspondencia con el contenido anterior.
- Si se necesita el mismo contenido, puede recuperarse mediante un error de página leve
- Si se necesita para otro fin, puede descartarse la identidad anterior y reutilizarse
- Existen listas de Standby diferenciadas por prioridad
7.2. Free
Es un estado en el que se ha perdido la correspondencia válida con el contenido anterior y la página puede asignarse. Sin embargo, dentro de la página puede quedar la secuencia de bits anterior. Si se entrega tal cual al modo usuario, existe el riesgo de filtrar información del proceso anterior.
7.3. Zeroed
Es un estado en el que el contenido son ceros y puede entregarse de forma segura como una nueva página al modo usuario. El error de página de demanda cero de la primera entrega era un ejemplo representativo de obtener una página Zeroed disponible y enlazarla a una PTE. La preparación de Free a Zeroed se realiza según la demanda y el estado del sistema.
En otras palabras, aunque tanto «Free» como «Zeroed» parezcan espacio libre, su estado de preparación desde el punto de vista de la seguridad es distinto.
8. El almacén de compresión de memoria — otro destino dentro de la RAM
El administrador de memoria de Windows 10 en adelante, cuando hay presión de memoria, en lugar de escribir de inmediato en disco las páginas de baja frecuencia de uso, puede comprimirlas dentro de la RAM en ciertos casos. Este conjunto de páginas comprimidas es el compression store (almacén de compresión).
En la implementación inicial de Windows 10, el almacén de compresión se contabilizaba dentro del Working Set del proceso System, pero en el Windows actual aparece en la lista de procesos de las herramientas de depuración como un proceso dedicado Memory Compression. Por lo tanto, al investigar la cantidad de compresión actual no debe seguirse únicamente el Working Set del proceso System. El objetivo en sí —mantener más aplicaciones en memoria física y reducir la E/S de disco— no ha cambiado.1011
No obstante, tenga presentes los siguientes puntos:
- Las páginas comprimidas también usan RAM
- Comprimir y descomprimir tiene un coste de CPU
- Comprimir no elimina la garantía del Commit
- No sigue siempre un orden fijo de «primero comprimir, luego el archivo de paginación»
- La política varía según el tipo de página, la presión y el historial de acceso
El indicador «En uso (comprimido)» del Administrador de tareas no significa que la compresión haya liberado por completo la memoria física. El almacén de compresión no es una función que elimine la necesidad del archivo de paginación, sino que añade, entre la RAM y el almacenamiento, una opción más que usa CPU para reducir la E/S.
9. El verdadero papel del archivo de paginación
El archivo de paginación cumple al menos tres funciones.
flowchart LR
accTitle: Las tres funciones del archivo de paginación
accDescr: El archivo de paginación amplía el Commit Limit, sirve de respaldo para las páginas privadas modificadas de baja frecuencia de acceso y actúa como receptor del volcado de memoria del sistema
pagefile["Archivo de paginación"] --> limit["Amplía el Commit Limit (margen del lado del límite)"]
pagefile --> backing["Respaldo de las páginas privadas modificadas"]
pagefile --> dump["Receptor del volcado de memoria del sistema"]
Figura 4: El papel del archivo de paginación no se limita a ser «RAM lenta». Incluso con un uso de 0, sostiene el límite y el volcado.
9.1. Ampliar el Commit Limit
El Commit Limit del sistema se determina, en términos generales, por la suma de la RAM y de todos los archivos de paginación. Si se elimina el archivo de paginación, el Commit Limit desciende a un nivel algo menor que la RAM instalada. Cuando el Commit Total alcanza ese límite, los nuevos Commit fallan, lo que puede provocar el cierre anómalo de aplicaciones o inestabilidad del sistema.4
Esto es independiente de «cuántos GB se están escribiendo ahora mismo en pagefile.sys». El archivo de paginación también es el margen del lado del límite que sostiene la garantía del Commit.
9.2. Sostener las páginas privadas modificadas
Si el archivo de paginación respalda las páginas privadas modificadas de baja frecuencia de acceso, esas páginas físicas pueden sacarse de la RAM y destinarse al código o los datos de uso frecuente.4 Al deshabilitar el archivo de paginación se reduce la opción de sacar estas páginas de la RAM. No puede afirmarse simplemente que «al no haber page-out, es más rápido».
9.3. Sostener el volcado de memoria del sistema (crash dump)
Para generar Memory.dmp cuando el sistema falla, se necesita un archivo de paginación o un archivo de volcado dedicado capaz de sostener el método de volcado elegido.2 La cantidad necesaria varía entre un volcado completo de memoria, un volcado de memoria del kernel y un volcado de memoria automático.
En entornos donde se realiza investigación de fallos, eliminar el archivo de paginación únicamente para ahorrar espacio puede hacer que no quede evidencia justo cuando más se necesita. Para el método de recolección, consulte también «Introducción a la recolección de volcados de memoria de aplicaciones de Windows».
10. El tamaño adecuado no es uniforme
No conviene decidir el tamaño del archivo de paginación basándose únicamente en una fórmula fija como «1,5 veces la RAM». Microsoft explica que el tamaño adecuado varía de un sistema a otro según los dos puntos siguientes y no puede generalizarse.2
- Commit Charge máximo del sistema en el pico
- El volcado de memoria del sistema que se necesite
En la práctica, conviene pensarlo en el siguiente orden.
10.1. Empiece por el tamaño administrado por el sistema
El valor predeterminado de Windows es administrado por el sistema. Aumenta o disminuye según la RAM instalada, la demanda de Commit y los requisitos de volcado, entre otros factores. Si no existen restricciones especiales ni resultados de medición, lo más seguro es partir de aquí.
10.2. Mida el Commit máximo con una carga representativa
Recopile los siguientes contadores durante un periodo prolongado con PerfMon.
Memory\\Committed BytesMemory\\Commit LimitMemory\\% Committed Bytes In UseMemory\\Modified Page List BytesPaging File(*)\\% UsageMemory\\Available MBytesMemory\\Page Reads/secMemory\\Page Writes/sec
Incluya en el periodo de recopilación los picos reales, como el procesamiento de fin de mes, las copias de seguridad, las compilaciones o el uso simultáneo de varios usuarios.
Un uso alto del archivo de paginación por sí solo no permite concluir que exista un problema de rendimiento del almacenamiento. Sin embargo, permanecer pegado al límite es una advertencia de falta de capacidad. Observe en conjunto si el Commit se acerca al límite, si hay una gran cantidad de páginas esperando en Modified, o si el disco está saturado.2
10.3. Defina primero los requisitos de volcado
Decida si necesita un volcado completo de memoria, si basta con un volcado de memoria del kernel, o si va a usar un archivo de volcado dedicado. Si va a cambiar a un tamaño fijo, debe satisfacer tanto el Commit máximo como los requisitos de volcado.
11. Compruébelo usted mismo
11.1. Observe las listas de páginas con RAMMap
Inicie RAMMap como administrador y abra primero Use Counts.7 Los elementos que hay que observar son los siguientes:
- Active
- Standby
- Modified
- Modified no write
- Free
- Zeroed
En Priority Summary puede comprobar que Standby está dividido por prioridad. En Processes puede ver el Working Set de cada proceso, y en File Summary y File Details puede seguir los datos de archivo presentes en la RAM.
A modo de prueba, lea una vez un archivo local de tamaño considerable, termine el proceso de lectura y luego pulse Refresh. Es posible que las páginas de ese archivo permanezcan en File Summary o en el lado de Standby. Si vuelve a leer el mismo archivo, las páginas que no se hayan reutilizado pueden recuperarse sin E/S de disco, o con muy poca. El resultado varía según la presión de memoria, el antivirus y el tamaño del archivo, así que fíjese más en la dirección de la transición de estados que en un valor puntual.
Tenga en cuenta que el menú Empty de RAMMap altera artificialmente el estado del sistema. No lo use para vaciar Standby como medida de mejora del rendimiento en una máquina de producción; empléelo únicamente en un entorno de pruebas aislado.
11.2. Separe Commit y Touch con Testlimit
Testlimit es una herramienta de Sysinternals que simula el agotamiento de recursos como memoria, identificadores (handles), procesos e hilos. Primero, ejecute lo siguiente con el binario que tenga a mano y compruebe la versión y el uso (usage) que se muestran.
.\\testlimit64.exe -?
Lo que sigue está pensado para Testlimit v5.24. En la sintaxis oficial de v5.24, -m [MB] reserva la cantidad de memoria indicada, -d [MB] reserva y hace Touch, -e [seconds] es el intervalo de asignación y -c [count] es el número de asignaciones. -c se especifica al final. Si el uso (usage) que ve en su equipo difiere, dé prioridad a esa información.12
A continuación, pruebe a pequeña escala en una VM desechable.
# -m 64: reserva 64 MiB, -e 1: intervalo de 1 segundo, -c 8: se detiene tras 8 repeticiones
.\\testlimit64.exe -m 64 -e 1 -c 8
# Mismo número de repeticiones e intervalo, pero con -d se hace Touch en cada región
.\\testlimit64.exe -d 64 -e 1 -c 8
Durante la ejecución, registre simultáneamente lo siguiente:
- El «Confirmado X/Y» del Administrador de tareas
- Active, Modified y Standby de RAMMap
Memory\\Committed BytesMemory\\Commit LimitMemory\\Available MBytesMemory\\Modified Page List Bytes
Si desea reproducir realmente el agotamiento del Commit, no lo haga en el PC anfitrión: use una VM de la que haya tomado una instantánea y aumente el número de repeticiones de forma gradual. Una ejecución que reserve automáticamente hasta el límite puede provocar que la pantalla se congele, que el proceso termine de forma anómala o que se pierdan registros. El objetivo no es desestabilizar el sistema operativo, sino observar que al acercarse al Commit Limit, los nuevos Commit fallan.
12. Cuatro malentendidos que conviene evitar en la práctica
12.1. “Hay mucho Standby, así que hay una fuga de memoria”
Standby es una caché reutilizable incluida en Available. Una fuga se determina observando si la línea base del Commit propio del proceso o el desglose de las asignaciones sigue aumentando incluso después de que termina la carga.
12.2. “Si se reduce el Working Set, la fuga se corrige”
El recorte solo cambia el estado residente; no libera el Commit ni la asignación virtual. Si se vuelve a acceder, la página regresa mediante un error de página.
12.3. “Si el uso del archivo de paginación es 0, no hace falta”
El archivo de paginación no solo respalda la cantidad de escritura actual, sino también el Commit Limit y el volcado de memoria en caso de fallo. Si se decide eliminarlo basándose solo en el uso en condiciones normales, se pierde tanto el margen en los picos como la evidencia en caso de incidente.
12.4. “Primero la compresión de memoria, luego siempre el archivo de paginación”
La compresión no es una canalización en serie fija. Windows elige dinámicamente según el tipo de página, la eficiencia de compresión, la carga de CPU, la presión de memoria y la existencia o no de un respaldo.
13. Resumen
- La base de datos PFN es el libro de registro que hace seguimiento de la propiedad, las referencias, las modificaciones y el estado en la lista de páginas de cada página física.
- Una página limpia (clean) que sale del Working Set permanece en Standby, y si vuelve a necesitarse el mismo contenido, puede recuperarse mediante un error de página leve.8
- Una página modificada (dirty) espera en Modified y se escribe de vuelta en el archivo de paginación si es privada, o en el archivo correspondiente si es una página mapeada, entre otros casos.3
- Available es la suma de Standby, Free y Zeroed, y que Standby sea alto no constituye por sí mismo escasez de memoria.1
- La compresión de memoria reduce la E/S comprimiendo páginas dentro de la RAM, pero no elimina el papel del Commit ni del archivo de paginación.10
- El archivo de paginación sostiene el Commit Limit, las páginas privadas modificadas y el volcado de memoria del sistema.42
- El tamaño adecuado se determina por el Commit máximo y los requisitos de volcado, y no puede fijarse mediante un multiplicador uniforme.2
- El recorte del Working Set y el vaciado de Standby no son una corrección de fugas de memoria.
La continuación es la tercera entrega: «Objetos de sección y copy-on-write: la verdadera naturaleza de las DLL y las asignaciones de archivos».
Seguimos por qué las páginas de archivo y las DLL que permanecen en Standby se ven como la misma página física desde múltiples procesos.
Artículos relacionados
- Interioridades de la memoria de Windows (parte 1) — El instante en que una dirección virtual se convierte en RAM física
- ¿Qué representa realmente el “uso de memoria” de Windows?
- Interioridades de la E/S de Windows (parte 4) — El administrador de caché y WriteFile
- Introducción a la recolección de volcados de memoria de aplicaciones de Windows
- Práctica con Process Explorer / Handle / VMMap
Áreas de consultoría relacionadas
KomuraSoft LLC se ocupa de la investigación de la presión de memoria en aplicaciones de Windows, el agotamiento del Commit, la paginación, el crecimiento del Working Set y el diseño para la obtención de volcados de memoria.
- Desarrollo de aplicaciones Windows
- Investigación de fallos y análisis de causas
- Aprovechamiento de activos existentes y soporte de migración
- Contacto
Referencias
</content>
-
Microsoft Learn, MEMORYSTATUSEX structure. Sobre cómo
ullAvailPhyses la memoria física que puede reutilizarse de inmediato sin escribir en disco, y que es la suma de las listas Standby, Free y Zeroed. ↩ ↩2 ↩3 -
Microsoft Learn, How to determine the appropriate page file size for 64-bit versions of Windows. Sobre cómo el tamaño adecuado depende del Commit máximo y de los requisitos de volcado de memoria y no puede generalizarse, así como sobre la lista Modified, el porcentaje de uso del archivo de paginación, los contadores relacionados y el archivo de paginación administrado por el sistema. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8
-
Microsoft Learn, Data corruption on IO write. Sobre cómo Modified Page Writer es un trabajador del sistema del administrador de memoria que recorre y escribe las páginas dirty respaldadas por el archivo de paginación. ↩ ↩2 ↩3
-
Microsoft Learn, Introduction to page files. Sobre cómo el archivo de paginación saca de la RAM las páginas modificadas de baja frecuencia de acceso, amplía el Commit Limit y sostiene el volcado de memoria del sistema. ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, !pfn (WinDbg). Sobre cómo permite mostrar el estado, las referencias, la dirección de PTE y otros datos de una entrada PFN especificada. ↩
-
Microsoft Learn, !memusage (WinDbg). Sobre cómo permite recopilar el uso de memoria física y los estados de página como Zeroed, Free, Standby, Modified y Active. ↩
-
Microsoft Learn, RAMMap - Sysinternals. Sobre cómo Use Counts, Processes, Priority Summary, Physical Pages, File Summary y File Details de RAMMap muestran el uso de la memoria física y las listas de páginas. ↩ ↩2
-
Microsoft Learn, Working Set. Sobre cómo el administrador de memoria recorta el Working Set para generar memoria disponible, y cómo las páginas en Transition o que permanecen en el Working Set de otro proceso pueden resolverse mediante un error de página leve. ↩ ↩2
-
Microsoft Learn, FileIo_Name class. Sobre cómo los eventos de File I/O de ETW tienen FileObject y FileName, y cómo, al correlacionar FileObject con los eventos de Disk I/O, puede identificarse la E/S del archivo en cuestión. ↩
-
Windows Insider Blog, Announcing Windows 10 Insider Preview Build 10525. Sobre cómo la implementación inicial del compression store en Windows 10 colocaba el conjunto de páginas comprimidas dentro del Working Set del proceso System, reduciendo la escritura en disco. ↩ ↩2
-
Microsoft Learn, Find Process ID (PID) in Windows. Sobre un ejemplo de lista de procesos con las Debugging Tools for Windows actuales, en el que aparece un proceso
Memory Compressioncon un PID distinto bajo System. ↩ -
Microsoft Learn, Testlimit - Sysinternals. Sobre la sintaxis oficial de Testlimit v5.24, en la que
-mreserva memoria,-dreserva y hace Touch,-ees el intervalo de asignación y-ces el número de asignaciones, especificándose-cal final. ↩
Artículos relacionados
Artículos recientes con las mismas etiquetas para profundizar en temas cercanos.
¿Qué representa realmente el «uso de memoria» de Windows? — Cómo interpretar correctamente Working Set, Private Bytes, Commit y el archivo de paginación
La memoria de Task Manager, Working Set, Private Bytes y Commit no son el mismo valor. Explica la memoria virtual y física de Windows y q...
Las entrañas de la memoria de Windows (parte 3) — Objetos de sección y copia en escritura: la verdadera naturaleza de las DLL y el mapeo de archivos
Explica cómo objetos de sección, mapeo de imagen/datos, caché compartida y copia en escritura hacen que las DLL compartan páginas físicas.
Interioridades de la memoria de Windows (1.ª parte) — El instante en que una dirección virtual se convierte en RAM física: el ciclo completo de un fallo de página
Une VirtualAlloc, VAD, tablas de páginas, TLB, demand zero y fallos duros para explicar el instante en que una dirección virtual se convi...
Cómo funcionan el portapapeles y arrastrar y soltar — Gestionar correctamente la transferencia de datos OLE en aplicaciones empresariales
Una tabla de Excel se deforma al pegarla y deja de poder pegarse si cierra el origen: es el portapapeles colocando el mismo contenido en ...
WPR/WPA en la práctica — Introducción al análisis de rendimiento del sistema para «todo el PC va lento»
Problemas como «todo el PC va lento» o «el arranque es lento», que el Administrador de tareas no explica, se investigan con WPR/WPA leyen...
Temas relacionados
Estas páginas sitúan el tema en un contexto más amplio de servicios y decisiones.
Temas técnicos de Windows
Portal sobre desarrollo de Windows, investigación de fallos y aprovechamiento de activos existentes.
Servicios relacionados con este tema
El artículo está directamente relacionado con los siguientes servicios.
Desarrollo de aplicaciones para Windows
Aplicaciones empresariales, integración de dispositivos y herramientas de comunicación, de los requisitos al desarrollo.
Preguntas frecuentes
Preguntas habituales en las consultas sobre el tema del artículo.
- ¿Una página que sale del Working Set se escribe de inmediato en el archivo de paginación?
- No necesariamente. Las páginas que no han sido modificadas pasan a Standby conservando su contenido y se convierten en una caché lista para reutilizarse de inmediato. Las páginas modificadas pasan a Modified y, cuando es necesario, se escriben de vuelta en el archivo de paginación o en el archivo correspondiente antes de avanzar a un estado reutilizable como Standby.
- ¿La memoria disponible (Available) del Administrador de tareas incluye la memoria de Standby?
- Sí. La memoria física disponible que informa Windows es la suma de Standby, Free y Zeroed. Standby conserva contenido antiguo, pero como puede reutilizarse de inmediato para otro fin si es necesario, se cuenta como memoria disponible.
- ¿La escritura en el archivo de paginación comienza solo cuando la RAM se agota por completo?
- No. Windows escribe en segundo plano las páginas modificadas de baja frecuencia de acceso, según el estado de la lista Modified y de la memoria disponible. No es un mecanismo simple que espere el agotamiento absoluto para desalojar todo de una vez.
- ¿Deshabilitar el archivo de paginación hace que Windows sea más rápido?
- En general, no se puede afirmar que sea más rápido. Deshabilitarlo reduce el Commit Limit, dificulta sacar de la RAM las páginas modificadas de baja frecuencia de acceso y también afecta al volcado de memoria del sistema (crash dump). Normalmente conviene dejarlo administrado por el sistema y decidir midiendo el Commit máximo y los requisitos de volcado.
- ¿Con la compresión de memoria ya no hace falta el archivo de paginación?
- No deja de ser necesario. El almacén de compresión reduce la E/S comprimiendo páginas dentro de la RAM, pero las páginas comprimidas también usan memoria física y no sustituyen la garantía del Commit. La elección entre comprimir y desalojar a disco es una política dinámica del administrador de memoria.
Perfil del autor
Página de presentación del autor del artículo.
Go Komura
Representante de KomuraSoft LLC
Especializado en desarrollo de software para Windows, consultoría técnica e investigación de fallos, sobre todo en proyectos con sistemas existentes y errores difíciles de reproducir.