Articles - Logiciel & scripts

Windows : mémoire virtuelle, pagefile, taskmgr & superfetch

  |   8040  |   Commentaires (4)  |  Logiciel & scripts

Introduction



Il y a quelques temps je suis tombé sur deux vidéos que Youtube a eu le malheur de me proposer en suggestion. Et malheureusement le résultat en fût un tweet d'humeur acide tellement que ça m'avait gavé de voir cela sur le coup.



Plutôt que de me lamenter sur Twitter (compte fermé depuis), paf un article d'utilité publique ! Vous trouverez sur Youtube des "tutos" pour augmenter sa mémoire virtuelle avec une belle miniature. D'accord mais en fait dans quel but ? Et puis pour faire quoi ?

Objectif



Dans cet article nous allons entrevoir comment fonctionne la gestion de la mémoire vive sous Windows et tenter de la régler. C'est à dire se poser des questions suivantes : est-ce que j'ai assez de RAM ? est-ce que je dois ajouter de la mémoire virtuelle ? Et ce sans le mot "TUTO", "TRUC & ASTUCE" et autre terme du genre dans les parages. Quand vous sortirez de cet article vous allez pouvoir épater la galerie.

Définitions



RAM = mémoire vive = mémoire physique





Dans un premier temps, déjà on va expliquer la RAM (Random Access Memory) : je pense que tout le monde en aura déjà entendu parler. Dans les PC, elle est généralement sous la forme de barrettes (j'en avais déjà parlé dans une ancienne vidéo) à placer dans des connecteurs sur la carte mère.



C'est la quantité de mémoire de stockage de type DRAM (avec rafraîchissement) accessible (adressable) par le ou les processeur(s) de la machine. La mémoire vive est un espace fini de "tant de Mo, Go, To". Tout ce que manipule le processeur transite/passe par la RAM. Tous les programmes que vous lancez sous Windows/Linux/MacOS occupent de la place en RAM. C'est une des missions du système d'exploitation que de la gérer.

La mémoire virtuelle





La mémoire virtuelle est un mécanisme qui permet, entre autres, de faire en sorte que le système d'exploitation puisse allouer aux programmes (y compris pour lui-même) plus de RAM que la RAM physique ne le permet matériellement parlant. Dans l'informatique historique, la mémoire coutait immensément cher. Sachez que le concept de mémoire virtuelle ne date pas d'hier, il provient des ordinateurs centraux (mainframes) des années 1960. Le système d'exploitation se charge là aussi de la gérer, de la manipuler, et c'est cette mémoire virtuelle qui sera accessible ensuite aux logiciels que vous allez lancer. Pour cela le système d'exploitation va utiliser en plus de la mémoire dite "de masse" comme par exemple un HDD ou un SSD. Ce mécanisme inclus de devoir faire des translations d'adresses virtuelles qui vont devoir pointer soit en adresses physiques vers la RAM soit en adresse disque vers le fichier d'échange. Ce rôle est à la fois assuré par le matériel (MMU) et le système d'exploitation (Windows/Linux/MacOS).



Sur les vidéos Youtube citées dans mon tweet et dans les sites comme celui-là, on vous présente la mémoire virtuelle comme quelque chose de secondaire à la RAM physique :

Citation :
Quand la mémoire physique est pleine alors le système d'exploitation va activer dans un second temps un mécanisme de mémoire virtuelle. =


Citation :
Et quand la RAM était dépassée, alors le système utilisait ce qu’on appelle la mémoire virtuelle.


FATAL ERROR



Non, le schéma de Wikipedia est explicite : la mémoire virtuelle est composée à la fois de la RAM physique et du/des fichiers d'échanges qui sont sur disque. C'est l'agrégation des deux. Dès que votre Windows démarre il manipule vos programmes avec des adresses virtuelles directement. L'OS fait en sorte que chaque processus (chaque logiciel lancé) possède son propre espace d'adressage virtuel isolé et indépendant (mappé) dans la mémoire virtuelle globale. Seule une partie de Windows en son sein n'y fait pas appel (dite non-paginée). Je pense que c'est plus de souci de simplification pour une meilleure compréhension de la part des quidams mais bon c'est quand même inexact. Heureusement que l'on trouve des très bons sites comme assiste.com pour remonter le niveau.

Mémoire virtuelle = RAM physique + fichier(s) d'échange (ou SWAP coté Linux)(en gros)



Le fichier d'échange (+SWAP)



Le fichier d'échange, appelé aussi "fichier de pagination" est défini comme tel chez Wikipedia :

Citation :
Le fichier d'échange (en anglais, « swapfile ») d’un système d'exploitation est un fichier informatique que l’OS utilise comme extension de la mémoire vive.


Rien de bien compliqué à comprendre, c'est exactement ce que l'on a vu plus haut. Donc c'est un fichier tout simple qui s'appelle pagefile.sys (dans la famille des Windows "NT") qui est sur le disque dur. Il est créé par défaut à l'installation de Windows sur le volume C: et se situe à la racine. Il est aussi caché (attribut), si vous voulez le voir il faut activer l'affichage des fichiers cachés dans l'explorateur Windows.



De plus il vous faudra demander l'affichage des fichiers "système" :



Maintenant vous pourrez le voir :



Sous Linux, pareil, quand Linux démarre sur un PC idem c'est tout manipulé en mode mémoire virtuelle mais c'est n'est pas un fichier d'échange comme sous Windows ce sont les partitions de type SWAP. En général les distributions Linux créent par défaut une partition de type "swap" à l'installation quelque part sur le disque si on laisse l'installeur en mode automatique. L'utilisateur peut généralement revoir la table des partitions soit au moment de l'installation soit plus tard. Il est à noter que Linux permet aussi de créer des fichiers d'échange sans que cela soit forcément des partitions du disque. Comme Windows quoi, mais on peut personnaliser le nom et choisir où le placer, c'est plus flexible.

Fichier d'échange coté Windows = SWAP coté Linux



Quelques explications



"La barrière des 3Go" liée au 32 bits



Sur les processeurs 32bits, la mémoire adressable maximum est de 4Go (2^32). Répartis comme suit : 2Go pour le système et 2Go pour les programmes. Vous ne vous étiez jamais demandé pourquoi seuls 2Go d'espace d'adresses virtuelles au maximum étaient disponibles pour un processus sous Windows ? :) Sauf si le commutateur /3GB est activé :



Et encore cela sert à quelque chose uniquement si le programme est compilé avec le petit flag IMAGE_FILE_LARGE_ADDRESS_AWARE qui va bien.

C'était pour la petite histoire, revenons à notre sujet. Donc déjà on a 4Go maximum. Car il faut ensuite amputer une partie qui est perdue avec le mapping des cartes PCI (MMIO - Memory-mapped I/O) qui ont le même espace d'adressage. Certains chipsets et contrôleurs, les cartes graphiques notamment, utilisent une grande partie de la RAM comme zone d'échange avec le GPU. Lorsque les routines d'un jeu vidéo placent les textures en mémoire vive, en fait derrière, les adresses pointent directement dans la mémoire vidéo de la carte graphique par exemple. Et ce pour des transferts plus rapides. Donc si une carte graphique de 512Mo est installée dans le système une fenêtre sur ces 512Mo seront pris sur les 4Go maximum possibles. Cette partie est réservée par le BIOS et les pilotes et n'est donc pas disponible pour l'OS et les programmes. Car comme le PCI et l'AGP sont des bus 32 bits uniquement, cette zone qui est prise dans la mémoire vive doit être obligatoirement prise en dessous des 4Go. C'est ce qu'on appelle le PCI Hole.



Cela donne en pratique de 2.8Go à 3.8Go utilisables maximum pour le système équipé de 4Go de RAM, selon le matériel, qui lui s'en est réservé une partie. Ce qui fait que les 4Go ne sont pas réellement exploitables. Si vous aviez uniquement 2Go de RAM vive (en barrette) cela ne pose pas de problème puisque votre carte vidéo défini cet espace dans la zone haute, c'est à dire entre 3.5Go et 4Go que le système n'utilise pas. Donc les 2Go sont normalement pleinement utilisables, alors que les 4Go ne le sont pas. Pour savoir quels sont les périphériques qui s'octroient ces mémoire dite "réservée matériellement", vous pouvez utiliser le gestionnaire de périphériques et demander d'afficher "Ressources par connexion". Plus de détails ici.



Depuis le Pentium Pro (on va dire le Pentium II pour les particuliers), les processeurs embarquent le PAE (Physical Address Extension) qui permet d'aller jusqu'à 36 bits d'adressage mémoire (au lieu de 32). De ce fait la barrière est repoussée de 4Go à 64Go. Mais même si le processeur le prend en charge, cela ne veut pas forcément dire que le contrôleur mémoire (dans le northbridge à l'époque) pouvait lui le faire. Ah Ah, d'où le fait que certaines cartes mère embarquent ou non cette option à activer dans le BIOS). Il est donc souvent désactivé de force.

Admettons que le matériel le prenne en charge, maintenant il reste à ce que l'OS puisse aussi s'en servir. Windows NT est compatible avec le PAE. Mais même si avec le PAE on pouvait faire plus, Microsoft avait mis en place des limitations soit disant pour des questions de compatibilité de pilotes. Les pilotes devant jongler entre le bus 32bits du PCI et les 36bits d'adressage du PAE, certains ne pouvaient fonctionner au delà de 4Go. Donc même si on activait le commutateur /PAE au boot, pour des questions de licence, Microsoft ne laissait pas aller au-delà de 4Go utilisable sur les versions 32bits grand public, uniquement sur certaines versions serveur.

Concernant Linux, la mode a une époque était de fournir des noyaux 32bits avec ou sans PAE de pris en charge.

Le "Memory Remapping"


Chose que le voit souvent dans les trucs et astuces en vidéo ici et là. En quoi consiste donc ce truc ? Et bien à modifier la cartographie mémoire. Il faut l'activer dans le BIOS de l'ordinateur. Sur les chipset x86 pouvant gérer plus de 4Go de RAM cette fonction fait en sorte de pouvoir placer l'espace pris par le MMIO au delà des 4Go. Ce qui laisse donc les 4Go libres pour les programmes, la partie prise par le matériel étant au dessus. Toutes les cartes mères ne proposent pas cette fonction dans le BIOS.

Pour plus d'informations : http://www.tomshardware.fr/articles/vista-gere-4go,2-561.html

L'ère 64 bits





Maintenant depuis presque 8 ans tous les processeurs grand public sont 64bits, Windows et Linux aussi. Donc fini cette barrière de 4Go. Voici la liste des éditions Windows et le maximum qu’il est possible d’utiliser. Sur le plan architecture nous en sommes donc à 256To maximum, Microsoft ne gérant que 44 bits : on redescend à 16 To répartis en 8To pour chaque process et 8To pour le système. On parle toujours ici de mémoire virtuelle. Mais avec les limitations de MS concernant la mémoire physique maximale prise en charge cela donne :



Ne pas confondre les différents niveaux de limitation :
  • celle théorique de l'architecture
  • celle liée architecture physique (bits)
  • celle liée à architecture de l'OS (bits)
  • celle liée à la licence


La pagination



Cette mémoire elle constitue un tout mais en fait la quasi-intégralité est émiettée, votre mémoire vive de n Go dans votre PC elle est en fait tronçonnée en petits morceaux appelées pages, d'où le terme de "pagination". Ces pages elles ont par défaut une taille de 4Ko. Il y a d’autres tailles ça peut être plus gros avec « Large pages » mais pour un usage particulier on s’en moque. Ces pages constituent l'unité de base de la mémoire. Une partie de la RAM est dite "non-paginée" : elle est utilisée par le noyau pour gérer (entre autre) la partie paginée.



S’occuper de la mémoire pour un système d'exploitation est très compliqué car il y a de la mémoire :
  • privée (un seul processus) et partagée (entre plusieurs processus)
  • réservée mais pas utilisée ("commitée"), un processus peut demander à réserver x Mo en mémoire mais sans pour autant les remplir.
  • etc...


Rajouter à cela des mécanismes de copy-on-write, le fait que le SE mutualise les sections de codes partagées comme les DLL par exemple. Si 30 processus réclament tous la DLL tartempion32.dll, pas la peine de la charger 30 fois en RAM, une seule fois suffit. Mais c'est aussi le cas des fichiers ouverts qui sont mis en cache en arrière plan, si le fichier database.db est ouvert en lecture seule par 4 processus simultanés, il ne sera chargé par le SE qu'une seule fois.



Donc c'est à la fois magique mais aussi peu flexible la mémoire. De plus, vous avez de la fragmentation en RAM, tout comme vous avez de la fragmentation sur les fichiers sur disque. Pour plus d'informations : voir l'article sur Wikipedia. Ce qui fait que la RAM n'est jamais pleinement à 100% utilisable, puisqu'il va y avoir des "trous". Même pour stocker 512 octets, le système réservera une page entière de 4K. 3.5K sont inutilisés. Sans compter l'ASLR pour lutter contre les malwares. En réalité, un processus (= instance d'un programme/logiciel) quand il tourne il est "réparti" en RAM, c’est du gruyère, même une partie est contiguë. Le SE réserve à l'avance une partie de la mémoire en prévision du fait que le processus va s'étendre...



A quoi sert et comment fonctionne le fichier d'échange ?



Le sous-système mémoire de Windows va simplement stocker les pages de mémoires les moins sollicitées dans cet espace, selon l'état des processus notamment et les recharger quand il y a besoin. D’où cette notion d'échange parce qu'il y a des allers-retours, c'est à dire des bascules de pages, entre le fichier d'échange et la RAM physique. Remarque : la partie de la RAM dite "non-paginée" doit elle forcément être située en mémoire physique, comme elle n'est pas concernée par la pagination, elle n'est pas concernée par le fichier d'échange.



Lorsqu'on lance trop de programmes simultanément (multitâche intensif) on "déborde" de la RAM physique. En arrière plan le système d'exploitation fait donc beaucoup appel au fichier d'échange, et résultat : le PC devient lent et peu réactif. Le disque dur est fortement sollicité pour faire ces allers-retours (c'est à ce moment qu'on aperçoit la LED d'activité du disque toujours allumée). Et on sait que le disque dur HDD/SSD (mémoire de masse) est plus lent que la mémoire centrale en terme de temps d'accès. Rappel :



Lorsqu'on se trouve dans cette situation, on dit qu'on "écroule" la machine. Par analogie : plus on charge un âne moins il avancera vite. Et si on continue à le charger, il finira par s'écrouler.



Se poser les bonnes questions



Maintenant que vous avez compris comment tout cela s'articule, qu'en est-il de votre situation à propos de la RAM ?

Comment surveiller l'utilisation de sa RAM ?



C'est ici que rentre en scène le « Gestionnaire des tâches » (Task Manager). Il s'agit d'un programme utilitaire de Windows, j’en avais déjà parlé dans une ancienne vidéo. Et j'avais dit qu'il était indispensable de savoir le maîtriser (du moins en partie). Pourquoi ? Car c'est justement la tour de contrôle de tout ce qu'il se passe sur votre ordinateur. Accessoirement, ça peut être utile non ?

Comment accéder au Gestionnaire des tâches ?



Il y a au moins 5 moyens d'y accéder facilement :

  • La combinaison de touches "CTRL+SHIFT+ECHAP".
  • La combinaison de touches "CTRL+ALT+SUPPR" puis choisir "Ouvrir le gestionnaire des tâches" dans le menu.
  • La combinaison de touches "Windows+R" (pour Run - exécuter) et entrer "taskmgr".
  • Entrer "taskmgr" directement dans la zone rechercher/exécuter dans le menu "Démarrer" ou la barre des tâches (Cortana).
  • Le clic droit dans la barre des tâches et choisir "Démarrer le Gestionnaire des Tâches" dans le menu contextuel.


Qu'elles sont les fonctionnalités du Gestionnaire des tâches ?



Préambule vite-fait sur les processus : un processus est une instance de programme "qui est en cours d'exécution" = programme/logiciel qui tourne. Chaque logiciel que vous lancez ou chaque service en arrière plan que Windows démarre correspond à un ou plusieurs processus. Chaque processus possède un thread (processus léger) ou plus. Idem sous Linux.

  • Surveiller l'activité des processus
  • Surveiller l'utilisation du processeur, de la mémoire, du réseau
  • Suspendre/Tuer (killer) un processus
  • Changer la priorité d'un processus (pour l’ordonnanceur)
  • Lancer un nouveau processus


Il faut savoir bien lire les informations du gestionnaire des tâches !



XP le gros troll


On va revenir un peu en arrière dans l'histoire de Windows et voir l’évolution du gestionnaire des tâches depuis Windows XP. Et oui c'est vieux, mais il faut en passer par là, vous allez comprendre pourquoi. Car le gestionnaire de tâches de Windows XP en a grugé du monde durant de longues années, probablement vous, et moi aussi au passage. Voici une capture d'écran du TaskMgr de Windows XP :



Je vous le dis d'emblée, à l'époque la personne chargée du gestionnaire de tâches de Windows chez Microsoft a fumé la moquette. :lol Le problème se situe dans le fameux graphique "Utilisation du fichier d'échange" (au milieu) qui représente l'utilisation de la mémoire. L'intitulé n'est pas le bon. De plus les utilisateurs ont cru bon de l'interpréter à leur manière, aie. Contrairement à une croyance populaire, cette valeur de 178Mo ne représente absolument pas ce que Windows XP prend en RAM (physique). Tu as vu mon Windows XP occupe 178Mo sur mes 512Mo de RAM. Et bien non. La place occupée en RAM physique est en fait indiquée en bas dans le cadre "Mémoire physique" en tout petit.

RAM totale installée = 523764/1024 = environ 511Mo
RAM disponible = 330556/1024 = environ 322Mo
RAM utilisée = (523764-330556)/1024 = (193208/1024) = environ 188Mo

Soit 10Mo de plus que nous espérions. :? Alors à quoi correspondent ces fameux 178Mo affichés sous nos yeux dans un joli graphique ? La fenêtre indique qu'il s'agit de "l'utilisation du fichier d'échange". Donc ce serait la taille occupée par des données dans le fichier d'échange. Hum cela serait bizarre non ? Alors Windows irait déjà prendre 178Mo dans le fichier d'échange sur disque alors qu'il me reste environ 322Mo de mémoire RAM disponible ? Heureusement, non, ouf. En réalité ces 178Mo correspondent à quelque chose de très important que l'on nomme en anglais la valeur "commit" potentielle, ce qu'on appelle en français la "charge dédiée". Cela ne vous dit rien ? Regardez dans les chiffres en bas de la fenêtre il y a toute une section pour elle. C'est elle la plus importante. La charge dédiée en gros c'est la quantité totale de mémoire virtuelle qu'il faudrait pour stocker tous les processus s'ils devaient être placés dans le fichier d'échange. Il s'agit ainsi de la quantité totale de mémoire virtuelle utilisée par Windows et les applications qui tournent, des données utiles. Vous pouvez le vérifier aisément : 182636/1024 = environ 178Mo, on retombe bien sur le nombre du graphique.

Ce graphique n'a donc rien à voir avec la mémoire physique, c'est bien une mesure de la mémoire virtuelle qui est affichée. Du coup que peut-on en conclure ? D'une part qu'ici Windows doit gérer 178Mo de mémoire virtuelle issue des applications et des services qui tournent. Et d'autre part que pour stocker cela, Windows occupe 188Mo de RAM. L'intégralité de la mémoire virtuelle semble donc tenir en mémoire vive.

Les 3 métriques de la charge dédiée (commit) :

  • Total : charge dédiée actuelle (voir ci-dessus)
  • Limite : quantité de mémoire virtuelle maximale atteignable. Bien souvent la limite sera donc la somme de la RAM physique installée + du fichier d'échange moins un reliquat. Ici la valeur est de 1280776Ko soit 1250Mo. Sachant que le système est équipé de 511Mo de mémoire physique. La taille du ou des fichiers d'échange est d'environ : 1280776Ko - 523764Ko = 739Mo (moins la partie non-paginée du noyau).
  • Pic : Maximum atteint depuis le lancement du système. On peut conclure ici que la charge dédiée est montée au moins une fois jusqu'à 197Mo (202116Ko/1024) sur cet ordinateur avant la capture d'écran.


Vista qui fait peur


Avançons dans le temps pour nous intéresser à Windows Vista le mal aimé, précurseur de Windows 7. Puisqu'il y a eu du changement dans la présentation des informations dans le gestionnaire de tâches à partir de cette version. J'ai pris une capture du net, désolé pour la qualité pas terrible.



Et c'est à partir de la que ça a été littéralement le gros boxon. Que remarque t-on ? Pour la partie graphique, le graphique du milieu n'est plus la surveillance de la mémoire virtuelle mais bel et bien cette fois-ci de la mémoire physique. Maintenant les utilisateurs peuvent savoir visuellement de manière intuitive si leur RAM est pleine ou pas. Ici la mémoire totale maximale utilisable par Windows et les programmes est de 1917Mo et le graphique indique que 799Mo sont utilisés. C'est plutôt clair. Seulement beaucoup d'utilisateurs à l'époque sont tombés dans 2 panneaux successifs à cause de cet affichage.

Premièrement, il fallait garder à l'esprit que la mémoire physique n’est qu’une partie de la mémoire virtuelle. Ici il n'y a aucun graphique pour afficher ce que Windows a placé dans le fichier d'échange. Du coup, juste regarder la mémoire physique n'est pas représentatif de la somme totale de la mémoire dont Windows et les programmes ont besoin. Car il y a une chose que je n'ai pas encore expliqué, le fichier d’échange n’est pas forcément utilisé que quand la RAM est pleine. Windows peut très bien décider de s’en servir avant que la RAM ne soit saturée. Alors comment connaître ici le volume des données que Windows a placé dans le fichier d’échange ? Pour cela il faut regarder l'information notée "Pagination". Ici la valeur est de 943Mo/4078Mo. "Pagination" n'est pas le bon terme, lisez "Charge dédiée" à la place. Donc on a au total 943Mo de mémoire virtuelle, sachant que la RAM prise est de 799Mo. Sur ces 799Mo de RAM prise 46Mo sont dédiés au noyau en mode non paginé qu'il faut soustraire puisqu'elle n'est pas virtuelle. L'écart est donc de 943-(799-46) = 190Mo. Sur 943Mo de mémoire virtuelle que gère Windows : 753Mo sont placés en RAM, et 190Mo dans le fichier d'échange. Donc il ne faut pas se fier aux seuls 799Mo du graphique.

Deuxièmement, vous ne trouvez pas qu'il y a quelque chose qui cloche dans cette capture d'écran vous ? Prenez 1 minute pour regarder attentivement toutes les valeurs. D'avoir voulu bien faire à être plus clair dans son gestionnaire des tâches, Microsoft a introduit une petite ligne intitulée "Libre" pour vous afficher la mémoire physique qualifiée de "Libre". Il est là le problème. Alors que le PC possède 1917Mo de mémoire vive et que 799Mo sont pris, il n'y en aurait que 247Mo de libre ? Évidemment le compte n'y est pas. 1917-799 = 1118, donc on devrait avoir 1118Mo de libre d'indiqué et non pas seulement 247Mo. Et vous n'imaginez pas comment à l'époque les gens ont paniqué à la lecture de cette fameuse valeur.

Quand Vista est sorti, beaucoup de gens s'étonnaient Windows il prend toute ma RAM, pourquoi Windows bouffe ma RAM ce con ? Vous trouverez de nombreux messages de la sorte sur les forums. Parce que la mémoire libre était à 0 ou une valeur proche de zéro. Certains étaient en mode panique, ils sont allés chercher une barrette de RAM en plus parce que Vista "il est lourd quoi". Ils sont passé de 2Go de à 4Go, enfin 3,5Go en 32 bits. Et puis au bout de quelques heures ils se sont aperçus que c'était la même chose : quoi Windows Vista il a encore rempli la RAM ?. Pareil la valeur était revenue proche de 0. (Rires) En réalité, il fallait pondérer cette valeur "Libre" avec la valeur "Cache" inscrite juste au dessus.

Oui, Windows utilise toute votre RAM, mais c'est à bon escient. Quitte à avoir plein de RAM autant s’en servir non ? Une RAM vide cela ne sert strictement à rien. Ce qu'il fallait comprendre, c'est quand parlant de libre, Microsoft voulait signifier plutôt "vierge de toute donnée utile", c'est à dire de la mémoire vive qui ne contient rien, du vide, que des zéros. Mais les systèmes d'exploitations embarquent des mécanismes de mise en cache, ils se servent de la mémoire vive pour y stocker des choses qui soit pourront servir ou resservir plus tard. Pour en revenir à la capture d'écran, la valeur cache est à 1049Mo. Ces 1049Mo de mémoire vive sont "mis de coté" par Windows, mais ils restent "disponibles" sur demande à tout moment, à la disposition des applications de l'utilisateur. Grosso-modo : mémoire vive réellement encore disponible = Libre + Cache (- Tampons).

Comment cela fonctionne ? Imaginons que l'utilisateur lance Photoshop ou une application gourmande. Windows va d'abord allouer de l'espace dans les 247Mo de mémoire "non-utilisée" = la partie libre qui ne contient rien. Et ce pour préserver au maximum les 1049Mo de données qu'il avait mis en cache jusque là et qui peuvent être utiles eux. D'où le fait que cette valeur "Libre" tend vers 0. C'est absolument normal. Windows va utiliser la partie libre tant qu'il le peut. Au fur et à mesure, si il n'y a pas assez d'espace libre (vierge) pour y caser Photoshop, alors dans un second temps Windows va sacrifier et grignoter sur sa partie cache. D'où cette notion de disponible car le cache est libérable à tout moment si une application nécessite de l'espace mémoire supplémentaire.

Ce comportement est toujours présent dans Windows 10, pour vous j'ai lancé plusieurs fois mon logiciel de montage Magix Video Deluxe (+2Go de Firefox) sur mon PC principal (16Go de RAM) et on remarque bien que Windows 10 a mangé toute la partie libre et préserve au maximum sa "Veille".



Seven le sauveur


Passons à Windows 7, l'affichage est identique à Vista, sauf qu'enfin la valeur disponible est affichée. Mais la valeur libre est encore présente. Espérons que les utilisateurs ne s'y tromperons pas.



Bon ici tout est cohérent. Depuis Windows Vista, il existe le moniteur de ressource. Quelle belle invention, terminé les chiffres, vous avez une magnifique jauge qui vous montre clairement de quoi est remplie votre mémoire physique et ce avec des jolies couleurs.



  • Matériel réservé : c'est ici que vous verrez comment le BIOS et les pilotes de votre OS 32 bits tronquent les fameux 4Go maximum (vu plus haut).
  • Utilisée : mémoire active utilisée par les programmes, Windows et ses pilotes
  • Modifiée : mémoire modifiée qui doit être flushée/synchronisée sur disque avant de pouvoir être utilisée pour autre chose.
  • Veille : mémoire passive, code et données mis en cache.
  • Libre : mémoire vierge, aucune donnée dedans (prête à être allouée).


La partie mise en cache (TOTALE) est de 870Mo. Elle regroupe la partie cache (ici indiquée "Veille") de 858Mo + la partie "Modifiée"
(dirty pages) de 12Mo, ces données modifiées servent aussi de cache (en lecture).

La mémoire disponible est de 886Mo. Elle regroupe la partie cache (ici indiquée "Veille") de 858Mo + la partie "Libre" de 28Mo. On ne peut pas compter la partie "Modifiée" car il faudrait d'abord écrire ces données sur disque afin de la libérer pour ensuite s'en servir de "Veille".

Concernant la valeur "commit" (charge dédiée), elle ne s’appelle plus "Pagination" mais "Valider". Les valeurs affichées sont les mêmes que celles de Vista. Ici la valeur est de 3626Mo utilisée sur 6841Mo maximum. Sachant que la RAM est de 3421Mo. Cela signifie que la taille du fichier d'échange actuellement allouée est aussi du même ordre.



Bingo. Ici on a un rapport de 1:1 (autant de pagefile.sys que de RAM physique).

Windows 8 et 10


L'interface a été encore remaniée à la sauce flat design. Mais je pense que vous saurez retrouver les informations par vous-même.




Sur les 16Go, seuls 15.7Go sont réellement exploitables en raison de 315Mo réservé matériellement. Encore une fois il est facile de se faire piéger, n'oubliez pas de toujours vous focaliser sur la valeur "Validée". Maintenant vous savez où et comment regarder l'utilisation de votre RAM et de la mémoire virtuelle.

La RAM/mémoire virtuelle qui sert de cache



Pourquoi et comment Windows garde t-il autant de données en "Veille" (ou cache) ? Windows met des données en cache de deux façons.

Avec ce que vous avez déjà lancé/ouvert précédemment


Faites le test chez vous. Démarrez votre PC (ou rebootez) et lancez Photoshop, Inkscape ou une application un peu gourmande après le démarrage une fois arrivé sur le bureau. Elle va mettre disons 15 secondes à s'ouvrir (simple exemple). Fermez le logiciel et ouvrez-le à nouveau. Vous observerez que cette fois-ci votre application démarre plus vite (disons 5-10 secondes). Pourquoi ? Lorsque vous fermez une application, Windows stoppe le programme (ferme les processus associés) mais le code (l'image de l'exécutable) ainsi que les DLL appelées passent dans la zone "Veille". Tout ceci reste en mémoire, en cache, en arrière plan, au cas où. Et justement au second lancement, Windows n'a plus besoin d'aller chercher sur le disque dur l’exécutable et toutes les DLL du logiciel, tout est déjà en RAM et c'est nettement plus rapide d'accès. D'où le fait qu'après un premier chargement long, tous les prochains lancements iront plus vite. Remarque : Windows peut aussi mettre en cache des fichiers de données (mapped files) et non pas que du code.

Plus vous lancez de logiciels au fur et à mesure que vous utilisez votre ordinateur et plus Windows va les mettre en cache au possible. C'est ce qui explique ce que l'on a vu avant avec Windows Vista et la fameuse mémoire "Libre" à 0Mo. Normal, c'est que le cache grossit et remplit la RAM.

En anticipé : le Superfetch


Mais depuis Windows Vista, une nouvelle fonctionnalité a fait son apparition. Le Superfetch ! Et c'est en partie à cause de lui que Vista n'a décidément pas eu de bol et a eu une sale réputation, cet OS était en avance sur son temps. Alors c'est quoi ce bidule ? Fetch en anglais signifie « aller chercher ». Il s'agit d'un service Windows (qui tourne en arrière plan). Si vous avez Windows 7, 8 ou 10, vous l'avez encore, il n'a pas été retiré (mais il a été amélioré), et il est activé par défaut.



Ce service a pour première mission d'analyser vos habitudes concernant les logiciels que vous lancez. Et il va s'apercevoir par exemple que vous lancez presque tout le temps telle application après votre ouverture de session. Une fois vos habitudes établies, la seconde mission de superfetch est d'aller pré-charger pour vous les applications que vous avez l’habitude de lancer. C’est en partie pour cela que votre disque dur grattait "pour rien" à l'époque Vista (en plus des mises à jour et de l'indexation des fichiers pour la recherche). C’est Windows qui allait placer en RAM en cache de lui-même par avance vos Photoshop, Sony Vegas, etc... que vous ouvriez souvent. Histoire de vous faire gagner du temps. Avant, sous XP il y avait le Prefetch mais ce n’est pas tout à fait la même chose. Ici on va plus loin. Donc lentement mais surement, petit à petit c'est ce service qui faisait grossir la fameuse valeur "Cache" dans le gestionnaire des tâches de Vista (et Seven) au détriment du "Libre". Si vous désactivez le service Superfetch et rebootez vous verrez que le cache ne montera plus de lui même si vous ne lancez rien. La philosophie de Superfetch est bien sur le papier mais elle soulève deux problèmes :

  • Le service génère des E/S disque supplémentaires, même si c'est à faible "doses", qui peuvent rentrer en concurrence avec d'autres tâches et d'autres applications dont vous êtes en train de vous servir à ce moment là. Et cela peut ralentir. Le combo Vista avec disque dur de 5400t/min est donc absolument à éviter.
  • Il se peut aussi qu'il mette en cache pour rien, je suppose qu'il fait des calculs de probabilités avec un pourcentage d'exactitude très haut. Mais c'est prendre le risque de charger plein de logiciels qu'en fait vous ne lancerez jamais durant votre session avant d'arrêter votre PC. Et dans ce cas là superfetch aura fait des E/S disque pour rien et en vous ralentissant au passage.


Les questions que vous devez vous poser



Que se passe t-il lorsque Windows manque de mémoire virtuelle ?



Lorsque Windows n'arrive plus à fabriquer de mémoire virtuelle pour les programmes qui en réclament votre système devient instable et vous n'êtes plus sûr de rien sur ce qu'il se passe.





Il vous propose généralement de tuer le programme qui consomme le plus de RAM, celui qui est le plus susceptible d'avoir une fuite mémoire et de remplir la RAM inutilement. Donc là Windows vous dit : j'ai plus de mémoire virtuelle fermez des programmes, sinon il va le faire d'office pour vous, et vous ne pouvez plus en lancer d'autre. Derrière il y a des programmes (services) qui peuvent crasher et vous pourriez perdre des données.

Comment augmenter sa mémoire virtuelle ?



Pour éviter ce message, vous avez au final deux options :

  • Soit vous rajoutez de la RAM (physique), des barrettes quoi ^^
  • Soit vous augmentez la taille du fichier d'échange ou mettre plusieurs fichiers d'échange.


L'accès au paramétrage du fichier d'échange se fait via les propriétés systèmes (voir les captures d'écran) : http://www.pcastuces.com/pratique/windows/7/optimiser_ssd/page4.htm

Par défaut le réglage est automatique sous Windows. Et il convient très bien pour la plupart des usages. Windows va accroître la taille du fichier d'échange automatiquement selon les besoins des applications que vous lancez. On peut toutefois gérer cela manuellement soi-même pour définir sur quel disque on veut le mettre, etc... mais encore faut-il savoir bien le tailler.

Comment tailler le fichier d'échange (à combien) ? PARTIE 1/2 - LA THEORIE



Sur Internet et sur Youtube on trouve tout et n'importe quoi là dessus. Je vous le dis clairement : il n'y a pas de valeur générale valable qui sera bonne pour tout le monde ! Par contre il y a une méthodologie. Il fut une époque où lorsque vous installiez Windows il était bête : il appliquait une règle selon la quantité de RAM que vous aviez d'installée. C'était fortement valable à une époque, mais ça ne l'est plus vraiment. Windows fabriquait par défaut un fichier d'échange dans une plage minimum et maximum qui correspond à 2,5 fois la RAM ou 3,5 fois la RAM, je ne sais plus la valeur exacte. Cela avait du sens à une époque mais plus maintenant. Pourquoi ? Un Windows contemporain quand il démarre avec l'AV et quelques utilitaires d'arrière plan il occupe disons 2Go maximum. Si vous êtes équipé de 8Go de RAM vous pouvez donc tout caser en RAM, on a tellement de RAM qu'on ne sait même plus quoi en faire à tel point qu'on a inventé le service superfetch qui vous précharger des choses avant même que vous n'en ayez donné l'ordre, c'est pour dire.

Plus une machine possède de RAM, moins elle a besoin de fichier d'échange





Toutefois, cette règle a toujours du sens. On vous a toujours indiqué une quantité de mémoire à prendre selon l'usage que vous alliez faire de la machine :

  • bureautique : prendre un PC avec 4 ou 8Go de RAM,
  • montage vidéo : prendre un PC avec 12 voire 16Go de RAM,
  • station expert : prendre un PC avec 32 voire 64Go de RAM, etc...


C'est à dire qu'on dimensionne la RAM d'une machine selon son usage futur. Et donc Windows derrière suivait au niveau du fichier d'échange : si cette machine a XGo de RAM alors on peut tolérer que l'utilisateur son PC il swappe au maximum jusqu'à X Go de fichier d'échange. Plus on a de RAM et plus on peut tolérer d'avoir un fichier plus gros si Windows doit y faire appel lors d'une grosse tâche.

Depuis les Windows récents ils ont inversés la vapeur et c'est surtout que c'est devenu plus dynamique qu'avant. Voici la différence de la valeur recommandée entre deux PC.

Windows RAM installée Taille FE recommandée
7 SP1 16Go 24Go
10 4Go 1.3Go


Windows 7 applique bêtement un ratio 1.5x la taille de RAM, ce qui est inutile, enfin presque on le vera après... tandis que Windows 10 au contraire préconise une valeur inférieure à la RAM installée. Remarque : Il est a noter que c'est la valeur recommandée, la taille varie selon la charge. Ces histoires de 1,5x fois la RAM ce n'est à suivre uniquement si on veut se faire une station de travail pour des lourds travaux, on va voir cela après avec un exemple concret.

Puis-je me passer de fichier d'échange ?



Vous pouvez décider qu'en réalité la quantité de RAM que vous avez sur votre PC suffit largement et que vous n'avez pas besoin de fichier d'échange, parce que tout ce que vous lancez peut tenir en RAM. Vous pouvez. Windows peut tourner sans fichier d'échange (depuis XP il me semble). Mais ce n'est pas recommandé. Conservez toujours un petit fichier d'échange de 2Go à 5Go. Il servira pour faire un dump mémoire en cas de crash et il servira de cache disque le reste du temps. Sans fichier d'échange, Windows vous affichera plus rapidement la fenêtre comme quoi il ne peut plus allouer de mémoire virtuelle.

Comment tailler le fichier d'échange ? (à combien) - PARTIE 2/2 - LA PRATIQUE



Personne ne peux vous le dire à par vous. Cela dépend de ce que vous faites sur votre machine (vos logiciels) et de la quantité de RAM que vous avez déjà. Comme dit plus haut : généralement plus vous avez de RAM physique, moins vous avez besoin du fichier d'échange. Sinon vous allez réserver un gros fichier d'échange sur votre disque dur alors qui ne servira pas. Vous allez vous priver d'un espace disque qui peut être précieux, surtout pour les SSD de petite taille.

Au final se sera cette fameuse valeur "commit" ou "charge dédiée" ou "Valider" ou "Validée" qui va vous l'indiquer. La procédure consiste en deux étapes : en premier vous lancez simultanément tout ce dont vous avez à utiliser comme logiciel et en second vous demandez à Windows combien de mémoire virtuelle au totale cela occupe pour tous ces programmes lancés simultanément. C'est comme au marché, si vous avez besoin de tant de kilos de pommes de terre pour votre tartiflette 8 personnes, le marchand pèse sur la balance vos patates et il vous indique le prix. Ici c'est pareil, vous chargez votre PC au max de ce que vous prévoyez de l'utiliser et ensuite vous regardez sur la balance combien ça pèse mais en mémoire.

Exemple concret (à titre personnel) pour faire des vidéos j'ai besoin d'avoir ouvert :
  • mon logiciel de montage vidéo avec évidemment le projet de chargé
  • puis en même temps j'ai besoin d'un navigateur internet de lancé (Firefox et Chrome) pour faire les captures d'écran
  • puis en même temps il me faudra Audacity (avec mes fichiers audio de chargés)
  • puis en même temps il me faudra paint.net pour faire des retouches (avec mes images de chargées)
  • puis aussi j'aurais besoin de LibreOffice (avec mon script sous forme de document Writer ouvert)
  • etc...


Voilà, il faut que mon PC et Windows "puisse tenir" avec tous ces programmes lancés simultanément. Ensuite demandons à Windows le total en commit = n Go. Donc pour être à l'aise niveau RAM il me faudrait n Go + une petite marge. C'est comme cela qu'il faut raisonner. Il y a quelques temps j'ai sorti une vidéo de 3 heures sur Youtube et mes 16Go de RAM n'ont pas été suffisants. J'avais posté cette news dans laquelle on retrouve les captures d'écran suivantes (désolé pour la petite taille, zoomez) :




On remarque que mes 16Go de RAM sont en fait utilisé qu'à 14.5Go dans le graphique. Pourtant on voit bien que la valeur validée est à 21/25. Soit en réalité 21Go de mémoire virtuelle utilisée de manière effective. Dont 12.5Go rien que pour Magix, reste le système, le Firefox et les autres programmes d'ouverts... Donc tout ne rentre pas en RAM ! Si on se contente de regarder le graphique du milieu uniquement, on pourait croire que ma quantité de RAM est suffisante puisque pas pleine. Et non loupé.

Plus d'infos en français : https://support.microsoft.com/fr-fr/help/2860880/how-to-determine-the-appropriate-page-file-size-for-64-bit-versions-of-windows

Les autres bonnes questions



Doit-on utiliser les logiciels de vidage de RAM (Ram optimizers / RamboostXP) ?



Horreur, malheur ! Il y a quelques mois de cela je discutais dans les commentaires avec un gars sur Youtube, il m'avait sorti comme quoi RamboostXP c'était bien ça permettait d'optimiser la RAM. Je lui ai dit que cela servait à rien d'utiliser ces trucs. Il m'a répondu que si, ça marchait que la RAM était bien vidée après. J'ai insisté sur le fait que oui je n'en doutais pas mais ça ne servait à rien et que c'était contre productif. On a fait du ping-pong comme ça pendant un petit moment, jusqu'à ce qu'il capitule enfin. Discussion complète ici.



Ce logiciel utilitaire était promu en son temps par la presse informatique, c'était le soft à avoir pour faire genre "je m'y connais" et à lancer de temps en temps pour "assainir sa RAM", aucun magazine ou site Internet qui l'avait recommandé à l'époque ne s'est excusé depuis de vous avoir induit en erreur et d'avoir raconté de la merde bien sûr. Ne comptez pas sur eux.

Dans un élan de bonté je lui expliqué en quoi ce logiciel était de la pure merde. Il fait quoi RamboostXP en fait ? Vous êtes-vous déjà posé la question ? En fait cela consiste à faire vider le cache de Windows tout simplement, comment faire ? C'est plutôt simple, quand vous cliquez sur "Optimise la RAM !" dans RamboostXP (et ses clones), il va au contraire dans un premier temps la remplir, il va demander à Windows plein de mémoire. Windows va donc puiser dans son cache qu'il va foutre en l'air pour le donner à RamboostXP. Au bout d'un moment Windows ne pourra plus donner de mémoire à RamboostXP. RamboostXP va ensuite tout supprimer et signaler à Windows : et bien finalement tout ce que j'ai pris comme mémoire je n'en veux plus ! Du coup Windows se retrouve à avoir plein de mémoire à remettre à zéro (à effacer) avant de pouvoir la réallouer à d'autres processus.

Si on résume : vous avez simplement foutu en l'air le cache de Windows, ce qui est contre-productif puisque maintenant quand vous allez ouvrir des programmes et ouvrir des fichiers et bien comme plus rien n'est caché en RAM et bien hop paye à nouveau tes accès vers le disque dur. Alors content ? :) Alors que le cache il est libérable si besoin comme on l'a vu en haut (même sous XP c'était déjà le cas), vous n'avez pas besoin de tous ces trucs de kikoo. Maintenant vous savez ce qu'il ne faut pas faire.

Je vais en profiter aussi ici de vous parler de la fameuse astuce AlwaysUnloadDll dans le registre de Windows. Astuce bien relayée et qui a encore la peau dure en ces années 2010. Encore une fois : une RAM vide cela ne sert à rien. Laissez ces putain de DLL en cache bordel. :o

Augmenter la taille du fichier d'échange = hausse des performances ?



C'est en partie vrai parce que le fichier d'échange va agir comme un cache supplémentaire mais c'est quand même globalement faux. La meilleure option reste de rajouter de la RAM (physique). C'est pour cela que dans cet article je vous ai démontré, qu'à moins d'en avoir vraiment besoin, au final c'est presque toujours une fausse bonne-idée pour la plupart des particuliers. Passer par un fichier d’échange sera toujours plus lent que de rajouter des barrettes de RAM, en raison des accès disques vers les SSD SATA/HDD qui sont lents par rapport à la vitesse de la mémoire centrale. Si encore vous avez des SSD en NVMe, qui passent par le PCI-E, je vous dirais pourquoi pas, le bus étant plus rapide.

En réalité la plupart du temps les gens essayent de régler un problème de performances qui n’a absolument rien à voir avec l'occupation de leur RAM, le fichier d'échange n'a rien à voir avec le débit réseau et n'augmentera pas la vitesse de votre processeur. Donc au final vous allez augmenter le fichier d'échange alors que vous n’en avez pas besoin, vous allez perdre de la place sur disque inutilement.

Certes vous pouvez très bien avoir 1Go de RAM physique et mettre 10Go de fichier d'échange, sauf que ça va ramer sévèrement. Si dans les serveurs les architectes mettent beaucoup de mémoire RAM qui coûte chère ce n'est pas pour rien, s'il y avait une solution alternative 5 fois plus économique à base de HDD cela ferait longtemps que les fabricants de mémoires auraient mis la clé sous la porte.



Déplacer le fichier d'échange sur une autre partition (dédiée) ?



C'est tout à fait possible, mais cela n'a quasiment aucun intérêt en pratique. Si vous voulez vraiment gagner en performances, dédiez un autre disque pour le fichier d'échange Car les opérations d'entrées/sorties (I/O) seront séparées du disque système. Certains disent que ça éviterait au fichier d'échange d'être fragmenté par les autres fichiers, en général Windows fait en sorte que les segments (extends) alloués soient contigus. Pourquoi pas mais en pratique moi je dis bof.

Mettre une taille fixe c'est mieux ?



C'est là ou par contre c'est bien, Nicky Win et les autres ont raison, indiquer à Windows que l'on veut un fichier de tant de Go directement et qui ne bouge pas, comme ça Windows alloue la place une fois pour toutes d'avance et pas de fluctuation. Ce qui fait qu'il n'est pas fragmenté. Mais pour cela il faut le récréer, si vous vous contenter de l'étendre, il ne sera pas défragmenté, même si vous avez mis une taille fixe.

Mettre le fichier d'échange sur une partition FAT32 (non-NTFS) ?



L'idée est bonne, placer le fichier sur un disque dont le système de fichier est "non journalisé" permettrait d'accélérer les échanges de pages. Certains ont eu l'idée, on trouve des traces là-dessus sur le net. Mais en pratique on ne gagne pas en performance non plus.

Est-il possible de défragmenter le fichier d'échange ?



Possible mais il faut passer par des utilitaires de defrag alternatifs. Évidemment le système compte dessus depuis le boot et s'en sert, donc pas possible d'y toucher parce qu'il est verrouillé par le noyau. Pas vraiment d'intérêt. Le meilleur moyen : désactiver le fichier d'échange. Rebooter. Et le recréer avec une taille fixe. Comme ça un gros fichier contigu sera créé à coup sûr. Pas besoin de défragmenter l'ancien.

Dois-je vider le fichier d'échange à chaque arrêt de la machine ?



Pseudo-astuce récurrente et absolument bidon, "à la con" même je dirais et bien visible. Contrairement à ce que certains disent cela n'a aucun impact sur les performances. Je rappelle qu'à chaque boot le noyau repart de zéro, le fichier d'échange est donc considéré comme étant parfaitement vierge de toute donnée utile pour lui, même si il avait des vieilles données dedans avant elles ne sont pas prises en compte. Il réécrit par dessus.

Il ne faut pas le faire pour deux raisons :

  • Premièrement, votre Windows va mettre plus de temps à se fermer, puisqu'il va effacer votre fichier d'échange en le remplissant de zéros quand il vous affichera « Arrêt en cours ».
  • Deuxièmement : si vous avez votre fichier d'échange sur un SSD, vous allez bien l'user. :lol


Cela n'a d'intérêt que pour des raisons de sécurité ! En effet, une fois l’ordinateur éteint le fichier d'échange est plein d'anciennes pages mémoires que Windows aura laissé de son lancement précédent, de votre session. Donc en analysant le fichier d'échange un pirate qui récupére le disque dur et donc le fichier pagefile.sys pourrait trouver avec des utilitaires forensics des mots de passe stockés, des cookies qui étaient en mémoire virtuelle, ou des morceaux de fichiers qui ont étés mis en cache par Windows.

Des bons outils



Comme vous l'avez remarqué le gestionnaire des tâches de Windows est un peu limité. Déjà une petite astuce, par défaut beaucoup de détails des processus sont masqués. Dans l'onglet "Détails" Faites un clic droit sur l'en-tête de colonne (pour les anciennes versions de Windows c'est dans la barre de menu). Cliquez sur Sélectionner les colonnes. On peut faire la même chose dans l'onglet "Processus".



Cochez les colonnes que vous voulez.



Vous obtiendrez des informations plus représentatives. Et notamment la possibilité de voir la ligne de commande complète avec les options et arguments donnés en paramètre.




Mais pour aller plus loin, utilisez Process Explorer de Mark Russinovich (lien local version v16.21) qui est plus complet même s'il est en anglais.



Vous pourrez ainsi bien faire la distinction entre la valeur commit et la mémoire physique :



L'onglet Memory est très complet, trop pour le novice peut-être. Mais il est inutile de connaître tout ce qui se passe ici. Ne prenez pas toutes les valeurs pour argent comptant : certaines sont en nombre de pages mémoire (4K) et non pas en octets.



Sources - Approfondir