Bien vu, j'avais zappé.
En fait, le problème vient du fait que le gestionnaire mémoire/cache disque OS a repoussé en swap des pages de process (celles de firefox, l'explorer windows, ou autre) considérées comme rarement touchées.
Et ça rame quelques instants plus tard lorsque les pages sont relues depuis le swap.
C'est exactement le même problème lorsque l'on gravait une image ISO de dvd (~4Go) sur des machines qui n'avaient que 4Go de ram physique:
- le burner lit séquentiellement l'ISO, le cache disque OS conserve ce qui est lu (pour rien dans ce scénario)
- tu touches quasi à rien pendant la gravure (ou le download, ou autre...), le gestionnaire mémoire converge vers "le marquage" de certaines pages mémoires comme froides (celles de l'explorer où il y a des pages qui stockent les messages d'erreur, les process en tâche de fond qui font rien, les DLLs d'icônes à la con....).
- en fin de gravure (au delà des 3Go on va dire dans cet exemple) lorsque les pages mémoire libres manquent, le gestionnaire mémoire va vouloir rendre le cache disque OS heureux en renvoyant en swap les pages mémoires de process rarement touchées (celles marquées comme froides donc)
- après la fin de l'opération, tu vas dans une autre appli, simplement l'explorer, et là ça rame pour récupérer les pages qui se font maintenant touchées.
moralité: des trucs ont fait un tour d'aller-retour dans le swap, à cause de la tentative de favoriser les futurs I/O de l'application la plus active.
---
C'est chiant, car pour contrer ça:
- le cache disque OS devrait détecter par heuristique que l'accès I/O est séquentiel (en lecture ou écriture), et devrait baisser la priorité de piquage de pages aux autres process lorsque le pool "libre" est épuisé.
- soit tu désactives le swap, ce qui est mal, car il y a toujours des trucs useless qui peuvent être libérés pour favoriser l'appli active.
----
Le contre-exemple, c'est par exemple un après-midi jeu vidéo.
Sur une machine de 16Go:
- Tu lances un gros truc, avec des grosses maps, genre un battlefield qui va pomper 10Go dans une grosse map
- 1Go nécessaires pour l'OS/drivers et les process de tâche de fond utilies
- 2Go perdu dans des trucs useless
=> Sans swap il te resterait 3Go au cache disque, donc 3Go de fichiers du jeu potentiellement conservées et réutilisées en cas de changement de map (le moteur essaye d'être conservateur au changemap, donc il recharge pas tout, sauf si tu quittes ; cas qui arrive avec bf quand tu changes de serveur, cas qui n'arrive pas dans dans un jeu source genre tf2 car tu changes de serveur sans quitter le jeu)
=> Avec swap, idéalement le gestionnaire mémoire renvoie tout ou partie des 2Go useless dans le swap, le cache disque OS monte à 5Go de données conservées qui ne seront potentiellement pas lues depuis le HDD/SSD au changement de map, ce qui est un gain de temps potentiel.
Tu "quittes" > les pages de trucs "useless" sont récupérées.
---
Au final ce cas borderline est effectivement présent depuis très longtemps (au moins Windows Xp), je pense qu'il existe aussi sous Linux et MacOS.
C'est pas trivial pour trouver les bonnes heuristiques au niveau couplage gestionnaire mémoire/cache disque.
C'est pas une bonne idée de provoquer l'invalidation du cache disque OS (hormis vouloir volontairement benchmarker son propre projet ou autre cas spécifique)
Il me semble que dans Windows 10, ils ont rajouté une priorité sur la pagination mémoire au niveau api win32, mais ce serait du cas par cas, et personne ne s'en sert.
---
Donc je dirais:
- le cache disque qui monte et consomme la mémoire libre est normal et optimal.
- ne jamais vider le cache disque OS (aucun "nettoyeur" genre ccleaner ne le propose, donc pas vraiment de soucis)
- le cas du swap post-opération sur un fichier qui fait 80% de la ram physique, malheureusement c'est LE cas borderline, c'est à MS d'améliorer leur heuristiques et le gestionnaire mémoire. (ce n'est pas un problème que pour eux, par design, c'est pas simple)
Message édité par bjone le 09-12-2015 à 16:26:43