[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: 'vidange' du swap



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



Reply to: