¿Cómo puede Windows volcar la RAM completa en el archivo de hibernación tan rápido?

65

Estaba leyendo un artículo que explicaba el procedimiento de hibernación en Microsoft Windows. Los puntos principales que saco de él son

  1. Windows volca toda la RAM (después de procesarla quizás) en el hiberfil.sysarchivo.
  2. Durante el arranque, se lee el archivo de hibernación y los contenidos se cargan en la RAM.

Mi pregunta es cuando generalmente estoy copiando un archivo de tamaño, digamos, 1 GB, tarda unos 2 minutos en completarse.

Sin embargo, cuando Windows está escribiendo el archivo de hibernación (durante el procedimiento de hibernación), todo el proceso demora entre 10 y 15 segundos. ¿Por qué hay tanta diferencia en la velocidad de escritura?

Mi tamaño de RAM es de 4 GB. (No estoy hablando de la tecnología de arranque rápido).

Puntos de referencia:

  1. Copiando un archivo de 1 GB del Disco 1 al Disco 2 (externo): 2.3 minutos.
  2. Hibernando el sistema: 15 segundos.
descifrador
fuente
3
No sé la respuesta, pero apuesto a que si revisas el libro Windows Internals "Capítulo 13: Inicio y apagado" te diría (si tuviera el libro yo mismo lo vería).
Scott Chamberlain
2
Esta es una buena pregunta. Cuando la hibernación se implementó por primera vez en 1998, no fue tan rápido.
Gabe
22
@coder: el sistema NT se asegura de que hyberfil.sys tenga todo el espacio asignado y que todo el archivo no esté fragmentado. En esa condición, no hay saltos de cabeza en el disco duro durante la operación. Entonces obtendrá velocidades efectivas como 150Mo / s. Puedes volver a verificar lo que dije con fsutil.
user2284570
3
El disco externo también suele ser más lento que el disco interno.
Harry Johnston
2
@EricLippert: ciertamente no almacena toda la RAM, pero eso aún no lo explica. Regularmente tengo pocos gigabytes de RAM activa que deben almacenarse (VS2013 o Eclipse + algunas cosas más requieren una gran cantidad de RAM), y se almacenan a la velocidad que me parece mayor que incluso la velocidad de escritura teórica de mi no SSD manejar.
Davor

Respuestas:

45

Esta es probablemente una respuesta triple.

Una cosa que puede estar en juego aquí es el nuevo apagado híbrido en Windows que cierra efectivamente sus aplicaciones, cierra la sesión y luego procede a hibernar el núcleo del sistema operativo. Tener estos datos guardados significaría que no es necesario "volver a hibernarlos" potencialmente.

La segunda cosa sería que la hibernación no necesitaría guardar páginas de memoria que están paginadas en el archivo de intercambio o que no están en uso (esta sería una razón para llenar agresivamente el archivo de intercambio y mantener los datos en la memoria también) .

El tercero sería que los datos del archivo de hibernación también están comprimidos . Combine eso con mi segundo punto y si solo tiene un pequeño conjunto de datos para exportar que contiene datos altamente comprimibles (los ejecutables generalmente se comprimen bien), entonces la cantidad de datos que salen al archivo de hibernación puede ser sustancialmente menor que el conjunto de trabajo de datos. Tenga en cuenta que, como se indica en los comentarios, las memorias caché de archivos y otros datos de búfer innecesarios podrían descartarse fácilmente sin efectos nocivos para reducir la cantidad de datos que se volcarán en el archivo de hibernación.

Además, los discos duros actuales son bastante rápidos. Con un disco que tiene una escritura sostenida del orden de 100 MB / s, podría escribir (sin comprimir) 4 GB de RAM en menos de un minuto. Como la hibernación se puede hacer como lo último después de suspender todos los procesos del usuario y antes de suspender la CPU, el sistema operativo generalmente tendrá la velocidad de escritura completa del disco. Esto es algo que no tendrá su punto de referencia simple, y la copia de un disco a otro será potencialmente más lenta que simplemente escribir RAM en el disco.

Combine estas cosas y la cantidad de datos que se escribirán en el archivo de hibernación podría ser bastante pequeña, potencialmente del orden de 1 GB y probablemente se escribiría en un bloque continuo grande en menos de 10 segundos.

Mokubai
fuente
37
O, para que quede más claro: su RAM probablemente no esté llena. Las memorias intermedias se vacían y la memoria caché se descarta en hibernación. Solo la memoria realmente utilizada por las aplicaciones debe escribirse en el disco. El apagado híbrido reduce la cantidad de memoria en uso al cerrar la sesión del usuario.
Daniel B
2
Las páginas que no están sucias son una declaración más general de "paginado en el archivo de intercambio", esto incluiría ejecutables. (Dado que los archivos ejecutables están algo fragmentados en el disco, esto podría ralentizar la activación). Además, es probable que se eliminen los búferes de archivos limpios, incluso si no forman parte de un archivo mapeado de memoria.
Paul A. Clayton
3
@ user2284570 del documento que vinculé en esa respuesta "Windows admite la hibernación copiando el contenido de la memoria en el disco. El sistema comprime el contenido de la memoria antes de preservarlo en el disco, lo que reduce el espacio requerido en el disco a menos de la cantidad total de memoria física en el sistema. "
Mokubai
44
@ user2284570: Eso se debe a que el peor de los casos es la compresión 1: 1. Windows debe asegurarse de que haya suficiente espacio (reservado) en hyberfil.sys para cualquier configuración de memoria posible, incluso si solo necesita una décima parte del tamaño de RAM para una hibernación en particular. Agregue a eso que una porción decente del uso de RAM son archivos cargados en la memoria (ejecutables, recursos ...), pero aún mapeados desde el HDD, y de hecho puede ahorrar mucha escritura. Haga que un programa genere 4 GiB de datos criptoaleatorios en RAM, y la hibernación lleva mucho más tiempo, e incluso entonces, algunos de ellos podrían haberse intercambiado.
Luaan
3
@ user2284570: el archivo es tan grande para garantizar que haya espacio en el disco para almacenar toda la memoria. No todo ese espacio se usa realmente en hibernación. Algunas veces el archivo tendrá (digamos) 7% de contenido de memoria comprimido, 93% de basura.
psmears
31

Primero, la cantidad de RAM que debe guardarse es sorprendentemente pequeña. De hecho, solo el conjunto de páginas sucias mapeadas ("reescritura diferida") debe vaciarse, así como también deben escribirse todas las páginas privadas que se han escrito y se ha reubicado el código ejecutable.

  • Los segmentos .text de ejecutables siempre están respaldados por la asignación de archivos. Eso también es cierto para al menos algunas DLL (pero no todas, depende de si necesitan ser reubicadas).
  • La memoria que está respaldada de manera similar por las asignaciones de archivos se puede descartar (se presume que no es CoW o RW y está sucia).
  • Todavía tendrá que producirse una diferida diferida, pero aparte de eso, los cachés se pueden descartar.
  • La memoria que se ha asignado pero que no se ha escrito (por lo general, la mayor parte de los datos de la aplicación) está respaldada por la página cero y puede descartarse.
  • La mayor parte de las páginas de memoria que están en estado "en espera" (el conjunto de trabajo residente real por proceso en Windows es sorprendentemente pequeño, solo 16 MB) se habrá copiado en el archivo de la página en segundo plano en algún momento y se puede descartar. .
  • Es posible que no sea necesario guardar las regiones de memoria asignadas por ciertos dispositivos, como la tarjeta gráfica. Los usuarios a veces se sorprenden de que conectan 8GiB o 16GiB a una computadora, y 1GiB o 2GiB simplemente se han "ido" sin razón aparente. Las principales API de gráficos requieren que las aplicaciones sean capaces de invalidar el contenido del búfer "en algunas condiciones" (sin decir exactamente qué significa esto). Por lo tanto, no es irrazonable esperar que la memoria anclada por el controlador de gráficos también se descarte también. La pantalla se va a apagar de todos modos, después de todo.

En segundo lugar, al contrario que usted copia un archivo, deshacerse del conjunto de páginas RAM que deben guardarse en el disco es una sola escritura secuencial y contigua desde el punto de vista de la unidad. La API Win32 incluso expone una función de nivel de usuario para esta misma operación. Gather write es directamente compatible con el hardware y funciona tan rápido como el disco es físicamente capaz de aceptar datos (el controlador extraerá los datos directamente a través de DMA).
Hay una serie de condiciones previas para que esto funcione (como la alineación, el tamaño del bloque, la fijación), y no funciona bien con el almacenamiento en caché y no existe la "reescritura diferida" (que es una optimización muy deseable en funcionamiento normal )
Esa es la razón por la cual no todos escribenfunciona así todo el tiempo. Sin embargo, cuando el sistema guarda el archivo de hibernación, se cumplen automáticamente todas las condiciones previas (todos los datos están alineados, del tamaño de la página y anclados) y el almacenamiento en caché se ha vuelto irrelevante porque la computadora se apagará en un momento.

Tercero, hacer una sola escritura contigua es muy favorable tanto para discos giratorios como para discos de estado sólido.

El archivo de intercambio y el archivo de hibernación suelen ser algunos de los primeros archivos creados y reservados en el disco. Suelen tener uno, como máximo dos fragmentos. Por lo tanto, a menos que los sectores estén dañados y el disco tenga que reasignar sectores físicos, una escritura secuencial lógica se traduce en una escritura secuencial física en un disco giratorio.

No se necesitan operaciones de lectura-modificación-escritura en el disco cuando se escribe una gran cantidad de datos contiguos y secuenciales. Este problema es menos pronunciado en discos duros giratorios que pueden escribir sectores individuales que son bastante pequeños (siempre que no escriba bytes individuales, lo que generalmente impide el almacenamiento en caché, el dispositivo no necesita recuperar el contenido original y volver a escribir la versión modificada). .
Esto es, sin embargo, algo que es muy notable en SSD donde cada escritura significa que, por ejemplo, un bloque de 512kB (que es un número habitual, pero podría ser más grande) tiene que ser leído y modificado por el controlador, y escrito de nuevo en otro bloquear. Si bien en principio puedes escribir (pero no sobrescribir)) unidades más pequeñas en discos flash, solo puede borrar grandes bloques, así es como funciona el hardware. Esta es la razón por la cual los SSD funcionan mucho mejor en grandes escrituras secuenciales.

Damon
fuente
Incluso si se reubica una DLL, lo único que se necesita para recuperarla es la dirección reubicada. La reubicación es un proceso determinista y puede repetirse.
MSalters
"Reúna escribir"? ¿Te refieres a "Más bien, escribe"?
Peter Mortensen
3
@PeterMortensen: No, realmente me refiero a recopilar escritura (en lugar de lectura dispersa). Esto significa escribir en un solo archivo mientras se recopilan los datos de múltiples ubicaciones. Proporciona una matriz de estructuras, cada una de las cuales contiene una dirección de inicio y una longitud (con estrictos requisitos de alineación). El sistema operativo los pasa al controlador y el hardware hace el resto.
Damon
1
@MSalters: Pero la reubicación crea una copia privada de la página, y luego es extremadamente difícil determinar si se han realizado otras modificaciones a la copia privada. Contraste con las asignaciones que no requirieron reparación, y use copia en escritura. Si se realizan otras modificaciones, habrá una copia privada. De lo contrario, la página seguirá configurada para CoW.
Ben Voigt
1
@MSalters Puede ser un proceso determinista, pero eso no implica que el código de hibernación opere en la misma capa de la pila de software que el enlazador. Si la hibernación está en la capa del núcleo y el enlace es la capa del usuario, entonces la hibernación no puede hacer suposiciones sobre lo que hace el enlazador.
Kasperd
10

No descarga toda la RAM en el momento de hibernación.

Ya tendrá una gran parte de la RAM ya duplicada en el disco. Esto no solo permite que la hibernación suceda rápidamente, sino que también permite que la memoria esté disponible rápidamente para nuevos programas (para que puedan iniciarse rápidamente).

Por lo tanto, solo tiene que escribir una pequeña fracción de los 4 GB y eso se puede hacer en 10-15s.

De microsoft :

Cuando la RAM es escasa (por ejemplo, los bytes comprometidos son mayores que la RAM instalada), el sistema operativo intentará mantener una cierta fracción de la RAM instalada disponible para uso inmediato copiando páginas de memoria virtual que no están en uso activo en el archivo de paginación . Por lo tanto, este contador no llegará a cero y no es necesariamente una buena indicación de si su sistema tiene poca RAM.

Peter Crotty
fuente
2

Además de todo lo anterior, creo que hay algunos otros factores en juego.

Una es que, al copiar un archivo, el archivo debe leerse y escribirse; la hibernación solo requiere que se escriba el archivo. ¡Está, por definición, ya en la memoria!

Estrechamente relacionado con esto, al leer un archivo y escribirlo al mismo tiempo, para ahorrar memoria, el proceso es: leer un fragmento, escribir un fragmento, actualizar el directorio (para mostrar el nuevo tamaño); leer un fragmento, escribir un fragmento, actualizar el directorio.

Cada vez que se mueve de una parte del disco a otra (por ejemplo, leer el archivo a para escribir el archivo b, escribir el archivo b para escribir el directorio y escribir el directorio para leer el siguiente fragmento) el disco tiene que buscar: mover las cabezas, permita que las cabezas se asienten, espere a que pase la parte correcta del disco. Esta es una de las ventajas de un disco de estado sólido: la búsqueda no lleva tiempo. Al hibernar, los datos se escriben de extremo a extremo. El archivo de hibernación (intercambio) está preasignado, por lo que no es necesario actualizar el directorio (no está cambiando el tamaño del archivo de hibernación, solo el contenido).

Y finalmente, su computadora ha suspendido todas las demás tareas: esto es lo ÚNICO que está haciendo (dudo que esto haga mucha diferencia, ¡pero seguramente hará algunas!). Incluso cosas como la administración de memoria y el cambio de tareas están suspendidas.

AMADANON Inc.
fuente
¡Seguramente hará una gran diferencia!
Lightness compite con Monica el
@LightnessRacesinOrbit: la contención de la CPU apenas hará ninguna diferencia. La falta de contención de E / S es un gran problema, pero esta respuesta ya ha declarado que la búsqueda mata el rendimiento y la búsqueda, no la falta de ancho de banda general, es el problema principal con la contención de E / S.
Ben Voigt
@BenVoigt: Sí, estoy de acuerdo. Y cuando tiene 40 procesos que intentan hacer cosas en el disco, eso aumentará sustancialmente la búsqueda de discos. (tl; dr No estaba hablando de contención de CPU)
Lightness Races with Monica
@LightnessRacesinOrbit: Eso parece ... inusual incluso durante el funcionamiento normal (todo excepto entrar y salir de la hibernación). Sé que cuando atrapo una tarea en segundo plano que golpea el disco, desinstalo el imbécil y lo reemplazo por algo que solo accede al disco cuando le pido algo.
Ben Voigt
@BenVoigt: Eso parece poco probable. El registro de demonios es el contraejemplo más obvio, seguido de cosas como las actualizaciones de archivos de deriva de ntpd. No estoy afirmando que ninguno de esos ejemplos tenga un gran efecto aquí, pero no creo que sea razonable esperar que ninguna tarea en segundo plano toque el disco de forma autónoma.
Lightness compite con Monica el
0

Probablemente esto se deba a que la RAM tiene velocidades de entrada / salida mucho más rápidas que el disco duro, por lo que la RAM puede emitir el contenido tan rápido como el disco duro puede leer.

Al copiar archivos, también está limitado por varios factores: la velocidad del disco, si tiene que leer dentro y fuera del mismo disco, llevará más tiempo, la velocidad limitada de la conexión (si se trata de una unidad externa), verificándolo no está sobrescribiendo nada, etc.

Wilf
fuente
99
pero aún así el sistema operativo necesita escribir los datos de 4 GB de RAM en el disco, que se rige por el cuello de botella de E / S
codificador
Suponiendo también parámetros favorables, implica que durante la hibernación, la velocidad de escritura de mi disco va de 40 MB / sa ~ 260 MB / s. ¿Puede ser lo correcto?
codificador
1
Probablemente, no debería haber demasiado cuello de botella de E / S, ya que solo necesita escribir los datos (probablemente haya algo en su lugar para que sepa que no sobrescribirá las cosas y dónde colocar los datos para que no Necesito leer el disco demasiado). En mi computadora portátil (de arranque dual de Linux) puedo usar dd if=/dev/zero of=/tmp/output.img bs=8k count=256ky obtener 1862606848 bytes (1.9 GB) copied, 1.81605 s, 1.0 GB/s, por lo que parece posible (agregaré que Windows copiar archivos parece demorar innecesariamente de todos modos).
Wilf
También puede obtener una transferencia mucho más rápida al copiar archivos a través de Internet local. Además, es posible que no necesite copiar todas las cosas en la RAM: algunos de los datos en la RAM pueden almacenarse en caché y no ser necesarios para restaurar el sistema al despertar de la hibernación.
Wilf
Acabo de probar el dd benchmark en mi sistema. Nunca pasó más de 52 MB / s: / (máquina antigua) Sin embargo, creo que "probablemente hay algo en su lugar para que sepa que no sobrescribirá cosas y dónde colocar los datos para que no sea necesario leer el disco demasiado " es la clave para la velocidad rápida.
codificador