Comment Windows peut-il vider la RAM complète dans le fichier d'hibernation si rapidement?

65

Je passais en revue un article expliquant la procédure de mise en veille prolongée sous Microsoft Windows. Les principaux points que j'en tire sont

  1. Windows vide la totalité de la RAM (après l'avoir traitée) dans le hiberfil.sysfichier.
  2. Lors du démarrage, le fichier d'hibernation est lu et le contenu est chargé dans la RAM.

Ma question est quand je copie habituellement un fichier de taille, disons, 1 Go, cela prend environ 2 minutes à compléter.

Toutefois, lorsque Windows écrit le fichier d'hibernation (au cours de la procédure d'hibernation), le processus complet prend environ 10 à 15 secondes. Pourquoi cette vitesse d'écriture est-elle si différente?

Ma taille de RAM est de 4 Go. (Je ne parle pas de technologie de démarrage rapide.)

Benchmarks:

  1. Copie d'un fichier de 1 Go d'un disque 1 à l'autre (externe): 2,3 minutes.
  2. Veille prolongée du système: 15 secondes.
codeur
la source
3
Je ne connais pas la réponse, mais je parie que si vous vérifiiez le livre Windows Internals "Chapitre 13: Démarrage et arrêt", le système vous le dirait (si je possédais le livre moi-même, je le vérifierais).
Scott Chamberlain
2
C'est une bonne question. Lorsque l'hibernation a été implémentée pour la première fois en 1998, elle n'était pas aussi rapide.
Gabe
22
@coder: le système NT s'assure que tout l'espace du fichier est alloué à hyberfil.sys et que l'ensemble du fichier n'est pas fragmenté. Dans cette condition, il n'y a pas de saut de tête sur le disque dur pendant l'opération. Donc, vous aurez des vitesses efficaces comme 150Mo / s. Vous pouvez revérifier ce que j'ai dit avec fsutil.
user2284570
3
Le disque externe est généralement plus lent que le disque interne.
Harry Johnston
2
@ EricLippert - il ne stocke certainement pas toute la RAM, mais cela ne l'explique toujours pas. J'ai régulièrement quelques gigaoctets de RAM active à stocker (VS2013 ou Eclipse + peu de choses prennent beaucoup de mémoire vive), et elles sont stockées à une vitesse qui me semble supérieure à la vitesse d'écriture même théorique de mon disque non SSD. conduire.
Davor

Réponses:

45

C'est probablement une triple réponse.

Le nouvel arrêt hybride de Windows, qui ferme efficacement vos applications, vous déconnecte, puis met en veille prolongée le noyau du système d’exploitation, fait partie des choses à jouer. Avoir déjà ces données sauvegardées signifierait qu'il n'est pas nécessaire de les "hiberner" potentiellement.

Deuxièmement, l'hibernation n'aurait pas besoin de sauvegarder les pages de mémoire qui sont transférées dans le fichier d'échange ou qui ne sont pas utilisées (ce serait une raison pour remplir le fichier d'échange de manière agressive et conserver également les données en mémoire). .

Le troisième serait que les données du fichier d'hibernation sont également compressées . Combinez cela avec mon deuxième point et si vous n'avez qu'un petit ensemble de données à exporter qui contient des données hautement compressibles (les exécutables sont généralement bien compressés), la quantité de données à envoyer au fichier d'hibernation peut être considérablement plus petite que le jeu de travail. de données. Notez que, comme indiqué dans les commentaires, les caches de fichiers et autres données de tampon inutiles peuvent facilement être supprimés sans effet néfaste, ce qui permet de réduire la quantité de données à dumper dans le fichier de veille prolongée.

De plus, les disques durs actuels sont assez rapides. Avec un disque ayant une écriture soutenue de l’ordre de 100 Mo / s, vous seriez en mesure d’écrire (non compressé) 4 Go de RAM en moins d’une minute. Comme l'hibernation peut être effectuée en dernier lieu après la suspension de tous les processus utilisateur et avant la suspension du processeur, le système d'exploitation aura généralement la vitesse d'écriture maximale du disque. C'est une chose que votre simple test n'aura pas, et copier d'un disque à un disque risque d'être plus lent que d'écrire de la RAM sur un disque.

Combinez ces éléments et la quantité de données à écrire dans le fichier d'hibernation pourrait être assez petite, potentiellement de l'ordre de 1 Go, et serait probablement écrite dans un grand bloc continu en moins de 10 secondes.

Mokubai
la source
37
Ou, pour être plus clair: votre RAM n'est probablement pas pleine. Les mémoires tampons sont vidées et le cache est supprimé en veille prolongée. Seule la mémoire réellement utilisée par les applications doit être écrite sur le disque. L’arrêt hybride réduit la quantité de mémoire utilisée en déconnectant l’utilisateur.
Daniel B
2
Les pages qui ne sont pas sales sont une déclaration plus générale de "paginé vers le fichier d'échange", ce qui inclut les exécutables. (Étant donné que les exécutables sont quelque peu fragmentés sur le disque, cela pourrait ralentir le réveil.) De plus, les tampons de fichiers propres peuvent vraisemblablement être simplement supprimés même s'ils ne font pas partie d'un fichier mappé en mémoire.
Paul A. Clayton
3
@ user2284570 du document que j'ai lié dans cette réponse "Windows prend en charge l'hibernation en copiant le contenu de la mémoire sur le disque. Le système compresse le contenu de la mémoire avant de le conserver sur le disque, ce qui réduit l'espace disque requis à une valeur inférieure à la quantité totale de mémoire physique. sur le système. "
Mokubai
4
@ user2284570: C'est parce que le pire des scénarios est une compression 1: 1. Windows doit s'assurer qu'il y a assez d'espace (réservé) dans hyberfil.sys pour toute configuration de mémoire possible, même s'il ne nécessite qu'un dixième de la taille de la RAM pour une veille prolongée. Ajoutez à cela qu'une part décente de l'utilisation de la RAM est constituée de fichiers chargés en mémoire (exécutables, ressources ...), mais toujours mappés à partir du disque dur, ce qui vous permet d'économiser beaucoup d'écriture. Demandez à un programme de générer 4 Gio de données crypto-aléatoires dans la mémoire vive (RAM) et l'hibernation prend beaucoup plus de temps - et même dans ce cas, certaines d'entre elles pourraient avoir été échangées.
Luaan
3
@ user2284570: le fichier est aussi volumineux pour qu'il y ait suffisamment d'espace sur le disque pour stocker toute la mémoire. Tout cet espace n'est pas réellement utilisé en veille prolongée. Parfois, le fichier contient (par exemple) 7% de contenu en mémoire compressée, 93% de courrier indésirable.
psmears
31

Premièrement, la quantité de RAM à sauvegarder est étonnamment petite. En fait, seuls les ensembles de pages modifiées mappées ("écriture différée") doivent être vidés, de même que toutes les pages privées écrites et le code exécutable déplacé doivent être écrites.

  • Les segments .text des exécutables sont toujours sauvegardés par un mappage de fichier. Cela est également vrai pour au moins certaines DLL (mais pas toutes, cela dépend si elles doivent être déplacées).
  • La mémoire qui est pareillement sauvegardée par des mappages de fichiers peut être supprimée (on présume que ce n'est ni CoW ni RW et sale).
  • L'écriture différée doit encore se produire, mais à part cela, les caches peuvent être supprimés.
  • La mémoire allouée mais non écrite (généralement la plus grande partie des données de l'application!) Est sauvegardée par la page zéro et peut être supprimée.
  • La plus grande partie des pages de mémoire en état de veille (le jeu de travail de résident réel par processus sous Windows est étonnamment petite, 16 Mo seulement) aura été copiée dans le fichier de page en arrière-plan à un moment donné et peut être ignorée .
  • Les régions de mémoire mappées par certains périphériques tels que la carte graphique peuvent (éventuellement) ne pas avoir besoin d'être sauvegardées. Les utilisateurs sont parfois surpris d’avoir branché 8GiB ou 16GiB à un ordinateur, et 1GiB ou 2GiB sont simplement "partis" sans raison apparente. Les principales API graphiques exigent que les applications puissent annuler le contenu de la mémoire tampon "dans certaines conditions" (sans préciser ce que cela signifie). Il n’est donc pas déraisonnable de s’attendre à ce que la mémoire bloquée par le pilote graphique soit également supprimée. De toute façon, l’écran va s’éteindre, après tout.

Deuxièmement, contrairement à ce que vous copiez un fichier, le vidage de l'ensemble des pages RAM devant être sauvegardées sur le disque constitue une écriture séquentielle unique et contiguë du point de vue du lecteur. L'API Win32 expose même une fonction de niveau utilisateur pour cette opération même. La collecte d'écriture est directement prise en charge par le matériel et fonctionne aussi rapidement que le disque est physiquement capable d'accepter des données (le contrôleur extraira directement les données via DMA).
Il existe un certain nombre de conditions préalables pour que cela fonctionne (telles que l'alignement, la taille de bloc, l'épinglage), et cela ne fonctionne pas bien avec la mise en cache et il n'y a pas de "réécriture différée" (qui est une optimisation très souhaitable en fonctionnement normal ).
C’est la raison pour laquelle chaque écriture n’est pasfonctionne comme ça tout le temps. Cependant, lorsque le système enregistre le fichier d'hibernation, toutes les conditions préalables sont automatiquement remplies (toutes les données sont alignées, redimensionnées et épinglées) et la mise en cache devient inutile car l'ordinateur va s'éteindre dans un instant.

Troisièmement, faire une seule écriture contiguë est très favorable à la fois pour les disques tournants et pour les disques à l'état solide.

Le fichier d'échange et le fichier d'hibernation sont généralement des fichiers parmi les plus anciens créés et réservés sur le disque. Ils en ont généralement un, au plus deux fragments. Ainsi, sauf si des secteurs sont endommagés et que le disque doit réaffecter des secteurs physiques, une écriture séquentielle logique se traduit en une écriture physique séquentielle sur un disque en rotation.

Aucune opération de lecture-modification-écriture n'est nécessaire sur le disque lorsqu'une très grande quantité de données séquentielles contiguës est en cours d'écriture. Ce problème est moins prononcé sur les disques durs en rotation qui peuvent écrire des secteurs simples qui sont assez petits (à condition que vous n'écriviez pas des octets, ce que la mise en cache empêche généralement, le périphérique n'a pas besoin d'extraire le contenu d'origine ni de réécrire la version modifiée.) .
C’est cependant quelque chose qui est très visible sur les disques SSD où chaque écriture signifie par exemple qu’un bloc de 512 Ko (un nombre habituel, mais il peut être plus grand) doit être lu et modifié par le contrôleur, puis réécrit vers un autre bloquer. Vous pouvez en principe écrire sur (mais pas écraser).) des unités plus petites sur des disques flash, vous ne pouvez jamais effacer d’énormes blocs, c’est la façon dont le matériel fonctionne. C'est la raison pour laquelle les disques SSD se débrouillent tellement mieux sur les énormes écritures séquentielles.

Damon
la source
Même si une DLL est déplacée, la seule chose dont vous avez besoin pour la récupérer est l’adresse déplacée. La relocalisation est un processus déterministe et peut être répétée.
MSalters
"Rassemblez écrire"? Voulez-vous dire "écris plutôt"?
Peter Mortensen
3
@PeterMortensen: Non, je veux vraiment dire rassembler écrire (par opposition à lire dispersée). Cela signifie écrire dans un fichier unique tout en rassemblant les données à partir de plusieurs emplacements. Vous fournissez un tableau de structures contenant chacune une adresse de début et une longueur (avec des exigences d'alignement strictes). Le système d'exploitation les transmet au contrôleur et le matériel fait le reste.
Damon
1
@MSalters: Mais la relocalisation crée une copie privée de la page et il est alors extrêmement difficile de déterminer si d'autres modifications ont été apportées à la copie privée. Contrastez avec les mappages qui ne nécessitent pas de correction et utilisez la copie sur écriture. Si d'autres modifications sont apportées, il y aura une copie privée. Sinon, la page sera toujours configurée pour CoW.
Ben Voigt
1
@MSalters Cela peut être un processus déterministe, mais cela n'implique pas que le code d'hibernation fonctionne sur la même couche de la pile logicielle que l'éditeur de liens. Si l'hibernation est au niveau de la couche du noyau et que la liaison est la couche de l'utilisateur, l'hibernation ne peut faire aucune hypothèse sur ce que fait l'éditeur de liens.
Kasperd
10

Il ne vide pas la totalité de la RAM au moment de la mise en veille prolongée.

Une grande partie de la RAM sera déjà dupliquée sur le disque. Cela permet non seulement une mise en veille prolongée rapide, mais également une mémoire rapidement disponible pour les nouveaux programmes (afin qu'ils puissent être lancés rapidement).

Par conséquent, il suffit d'écrire une petite fraction des 4 Go, ce qui peut être fait en 10-15 secondes.

De Microsoft :

Lorsque la quantité de mémoire RAM est insuffisante (par exemple, Octets validés est supérieure à la quantité de RAM installée), le système d’exploitation essaie de garder une certaine fraction de la mémoire RAM installée disponible pour une utilisation immédiate en copiant dans le fichier d'échange des pages de mémoire virtuelle inutilisées. . Par conséquent, ce compteur n’atteindra pas zéro et n’indiquera pas nécessairement si votre système manque de mémoire vive.

Peter Crotty
la source
2

En plus de tout ce qui précède, je pense qu'il y a quelques autres facteurs en jeu.

La première est que, lors de la copie d’un fichier, celui-ci doit être lu et écrit; hybernation exige seulement que le fichier soit écrit. C'est, par définition, déjà en mémoire!

De manière étroitement liée à cela, lors de la lecture et de l’écriture simultanées d’un fichier, le processus consiste à économiser de la mémoire: lire un morceau, écrire un morceau, mettre à jour le répertoire (pour afficher la nouvelle taille); lire un morceau, écrire un morceau, mettre à jour le répertoire.

Chaque fois que vous passez d'une partie du disque à une autre (par exemple, lisez le fichier a pour écrire le fichier b, écrivez le fichier b pour écrire le répertoire et écrivez le répertoire pour lire le bloc suivant), le disque doit chercher - déplacer les têtes, laissez les têtes s'installer, attendez que la partie droite du disque passe. C'est l'un des avantages d'un disque SSD: la recherche ne prend pas de temps. En mode hibernation, les données sont écrites de bout en bout. Le fichier d'hibernation (swap) est pré-alloué, il n'est donc pas nécessaire de mettre à jour le répertoire (vous ne modifiez pas la taille du fichier d'hibernation, mais uniquement son contenu).

Et enfin, votre ordinateur a suspendu toutes les autres tâches - c’est la SEULE chose qu’il fait (je doute que cela fasse une grande différence, mais cela en fera forcément!). Même des éléments tels que la gestion de la mémoire et le changement de tâche sont suspendus.

AMADANON Inc.
la source
Ça va faire une énorme différence!
Courses de légèreté avec Monica
@ LightnessRacesinOrbit: les conflits de processeurs ne feront pratiquement aucune différence. L’absence de conflit d’entrées / sorties est un gros problème, mais cette réponse a déjà indiqué que la recherche de la performance tue et la recherche, et non le manque de bande passante globale, est le principal problème des conflits d’entrées / sorties.
Ben Voigt
@ BenVoigt: Oui, je suis d'accord. Et quand vous avez 40 processus qui essaient tous de créer des tâches sur disque, cela va considérablement augmenter la recherche de disque. (tl; dr je ne parlais pas de conflit de processeur)
Courses de légèreté avec Monica
@LightnessRacesinOrbit: Cela semble inhabituel, même pendant le fonctionnement normal (tout sauf l'entrée et la sortie en veille prolongée). Je sais que lorsque je détecte une tâche en arrière-plan sur le disque, je désinstalle le meunier et le remplace par quelque chose qui n'accède au disque que lorsque je le demande.
Ben Voigt
@ BenVoigt: Cela semble peu probable. La journalisation par démon est le contre-exemple le plus évident, suivie de choses telles que les mises à jour des fichiers de dérive de ntpd. Je ne prétends pas que l'un ou l'autre de ces exemples a un impact important ici, mais je ne pense pas qu'il soit raisonnable de s'attendre à ce qu'aucune tâche d'arrière-plan ne touche le disque de manière autonome.
Courses de légèreté avec Monica
0

Ceci est probablement dû au fait que les vitesses d’entrée / sortie de la RAM sont beaucoup plus rapides que celles du disque dur, de sorte que la RAM peut produire les données aussi rapidement que le disque dur peut les lire.

Lors de la copie de fichiers, vous êtes également limité par divers facteurs - la vitesse du disque, si elle doit être lue et relue sur le même disque, cela prendra plus de temps, la vitesse limitée de la connexion (sur un lecteur externe), vérifiée n'écrase rien, etc.

Wilf
la source
9
mais le système d'exploitation doit encore écrire les données de 4 Go de RAM sur le disque, ce qui est régi par le goulot d'étranglement des E / S
codeur
En supposant également des paramètres favorables, cela signifie que, pendant l'hibernation, la vitesse d'écriture de mon disque passe de 40 Mo / s à environ 260 Mo / s. Cela peut-il être correct?
codeur
1
Probablement - il ne devrait pas y avoir trop de goulot d'étranglement d'E / S, car il suffit d'écrire les données (il y a probablement quelque chose en place pour qu'il sache qu'il ne va pas écraser les données et où placer les données, alors ce n'est pas le cas besoin de lire trop le disque). Sur mon ordinateur portable (linux dual boot), je peux utiliser dd if=/dev/zero of=/tmp/output.img bs=8k count=256ket obtenir 1862606848 bytes (1.9 GB) copied, 1.81605 s, 1.0 GB/s, de sorte que cela semble être possible (je vais ajouter que la copie de fichiers Windows semble prendre inutilement longtemps de toute façon).
Wilf
Vous pouvez également obtenir un transfert beaucoup plus rapide lors de la copie de fichiers via Internet local. En outre, il n’est peut-être pas nécessaire de copier tout ce qui se trouve dans la RAM - certaines des données de la RAM peuvent simplement être mises en cache et ne pas être nécessaires pour restaurer le système à la sortie de veille prolongée.
Wilf
Je viens d'essayer la référence dd sur mon système. Il n’a jamais dépassé 52 Mo / s: / (ancienne machine) Cependant, je pense "qu’il ya probablement quelque chose en place pour qu’il sache que les données ne seront pas écrasées ni où placer les données, de sorte qu’il n’a pas besoin de lire le disque. trop " est la clé pour la vitesse rapide.
codeur