Franck Joncourt, mardi 13 février 2007, 23:20:05 CET >[...] > Bonsoir,
'jour, > Moi je considere la swap comme memoire ram de second niveau (cache) ; > on l'utilise pour faire basculer des informations qui etaient > presentes en ram, sans les detruire, pour laisser place a des > ressources de priorite superieures, placees elles en ram. Presque. C'est la RAM qui est un cache pour la mémoire virtuelle, laquelle est la somme de la swap et d'une partie de la RAM (overcommit). On a : 1. un peu de RAM pour le noyau ; 2. beaucoup de RAM pour les caches (partie « text » du code et fichiers) ; 3. le reste de la RAM pour les données des programmes ; 4. le swap pour les données des programmes. Et on espère que la mémoire utilisée à un moment donné tient dans la partie 3. pour ne pas avoir à aller en lire/écrire des pages dans la swap. Le noyau préfère aussi utiliser la RAM comme cache : quand les données ne servent pas, elles sont mises en swap pour faire de la place. > Si la swap ne sert qu'a cela pourquoi vouloir la vider ? > Je pense qu'elle n'est jamais nettoye mais que les donnees sont > reecrites les unes par dessus les autres en fonction des besoins. > Ce serait un peu comme l'allocation d'un buffer de 256 caracteres, par > exemple, pour contenir plusieurs chaines de caracteres. Je ne > purgerais jamais mon buffer lors du chargement des chaines de > caracteres car je sais exactement ou se trouvent les donnees utiles > (pointeurs - delimiteur de chaine). Oui c'est à peu près ça. > Je ne comprends pas l'utilite de "vider la swap", puisqu'elle sera > rechargee ensuite avec au moins une partie des donnees qui y etaient > deja presentes afin d'accelerer le "calcul". Parce que les mécanismes de suspension sur disque (hibernation) utilisent la swap comme espace de stockage persistent. Ils y sauvent l'état du système. Donc, au minimum, ils doivent sauver les données du noyau et les données anonymes (et sûrement quelques données supplémentaires). Sans doute doivent-ils aussi sauver les caches fichiers qui sont modifiés en mémoire mais pas encore enregistrés et peut-être quelques autres données. En tout cas, si le swap est déjà plein, ces mécanismes ont tendance à avorter (ils ne forcent pas le vidage des caches). D'où la question : comment vider le swap pour que l'hibernation se passe facilement. En y repensant, je pense que vider les caches devrait être tout aussi efficace et moins dangereux : en général, la mémoire allouée est de taille_du_swap + taille_de_RAM/2 (1/2 = /proc/sys/vm/overcommit_ratio / 100), donc toute la mémoire allouée ne tient pas forcément en RAM seule, donc vider la swap sans perte de données (= sans qu'un processus saute) n'est pas toujours possible. Pour vider les caches (depuis 2.6.16) : sync ; sync ; sync ; echo 3 > /proc/sys/vm/drop_caches > Voila, j'espere ne pas avoir ete trop confus :) Itou. -- Sylvain Sauvage

