# [Memoire] Pb de swap et de cache (bug 403449)

## pums974

Bonjour,

J'ai remarquer que mon pc utilisait le swap sans raison : free -h

             total       used       free     shared    buffers     cached

Mem:          3,9G       689M       3,2G         0B        31M       348M

-/+ buffers/cache:       310M       3,6G

Swap:         5,0G       321M       4,7G

Alors j'ai voulu le vider : swapoff -av 

swapoff sur /dev/sda2

swapoff: /dev/sda2 : échec de swapoff: Ne peut allouer de la mémoire

Je ne comprend pas pourquoi il refuse.

je rajouterais que je n'arrive pas a vider le cache avec : echo "1" > /proc/sys/vm/drop_caches

Je pense que c'est lié à d'autres problèmes lié à la gestion de la mémoire chez moi : https://bugs.gentoo.org/show_bug.cgi?id=403449

Est-ce que ca parle à quelqu'un ?Last edited by pums974 on Mon Feb 27, 2012 8:59 pm; edited 1 time in total

----------

## xaviermiller

Bonjour,

Pourrais-tu mettre le titre de ton message en conformité avec le forum ?

Merci d'avance !

----------

## pums974

Bonjour,

Au temps pour moi, désolé de ne pas l'avoir fait dés le début.

C'est corrigé, mais je ne suis pas trop sur de ma description, si tu pense à quelque chose de plus clair....

----------

## xaviermiller

Merci pour le titre  :Wink: 

Pour le reste, je ne vois pas trop, je laisse la main à l'équipe

----------

## pums974

Déjà je ne suis plus sur,

quand je fais echo "1" > /proc/sys/vm/drop_caches 

je suis bien censé me retrouver avec 0 de cache affiché dans free ?

et j'ai fais un test de plus, j'ai rajouter un swap sdd2 et j'ai pu désactiver mon swap sda2, et ce instantanément, sans transfert de données. Mais sans pouvoir desactiver sdd2 ensuite.

Donc :

1 - Je ne comprend pas ce que sont les données qui sont dans mon swap, mais qu'il ne transfert pas dans le nouveau swap...

2 - Mais pourquoi refuse-t'il de vivre sans swap alors qu'il a toute la place dont il a besoin en mémoire.

----------

## xaviermiller

Si le swap ne se vide pas, c'est qu'une application a de la mémoire en swap...

Ferme toutes tes applications avant de dropper ton swap.

----------

## pums974

A ce moment là je n'avais quasiment aucune application ouverte, si ce n'est un terminal et gnome...

D'habitude il me semble que je peut vider mon swap à peu près à n'importe quel moment...

Comment je peux savoir quel application utilise le swap ?

----------

## ghoti

Tu trouveras sur cette page une série de raisons qui peuvent pousser le kernel à recourir à la SWAP alors qu'il y a de la RAM disponible...

----------

## pums974

Bonjour,

Désolé de relancer le sujet, mais je ne comprend toujours pas.

Je fais, dans l'ordre

# swapon /dev/sda2

*utilisation du PC *

# free 

           total       used       free     shared    buffers     cached

Mem:       4045484    3545152     500332          0     157632    1473384

-/+ buffers/cache:    1914136    2131348

Swap:      5245216     278700    4966516

# sync

# sysctl -w vm.drop_caches=3

# sysctl vm.swappiness=0

# free -m

             total       used       free     shared    buffers     cached

Mem:          3950       2347       1603          0         26        599

-/+ buffers/cache:       1721       2229

Swap:         5122        269       4852

# swapon /dev/sda3

# swapoff /dev/sda2

# free -m

             total       used       free     shared    buffers     cached

Mem:          3950       2642       1307          0         60        799

-/+ buffers/cache:       1783       2167

Swap:        10235          0      10235

# swapoff -av

swapoff sur /dev/sda3

swapoff: /dev/sda3 : échec de swapoff: Ne peut allouer de la mémoire

Pourquoi veut-il allouer de la mémoire puisqu'il utilise 0 de swap ???

----------

## DuF

Bonjour,

Alors pour moi il y a plusieurs sujets : 

- ton système swap-t-il ? D'après moi on n'en sait rien, tout du moins nous n'avons pas les informations pour le savoir. J'y reviens après  :Smile: 

- Les commandes swapon et swapoff servent seulement à proposer une zone mémoire supplémentaire de type pagination/swap. Il s'agit en général de disques/partitions que l'on dédie à cette activité. [EDIT]Je suis allé un peu vite là. Je comprends bien que l'enchainement d'un swapoff et d'un swapon c'est pour forcer le système à copier cette zone mémoire en ram et repartir avec un swap vide, je ne le remets pas en cause, mais ce n'est pas le but de ces fonctions. C'est pour ça que je fais ce rappel et recentre le sujet sur l'usage attendu afin d'éviter tout contournement, l'objectif étant de comprendre ce qui se passe et d'éviter toute solution curative qui ne serait pas préventive.

- La succesion de commandes swapon/swapoff ne fait que perturber le système sur les zones de pagination/swap qu'il a a disposition. Sachant qu'il peut réserver de la mémoire (en swap) sans l'utiliser réellement (par des écritures disques en l'occurence) il peut échouer sur un swapoff s'il venait de faire une réservation mémoire dans cette zone.

- Le fait qu'il reste de la mémoire 'Free' n'est pas forcément un indicateur de swap ou pas, comme l'indique Ghoti en suivant son lien. En effet un exemple simple (qui n'est pas forcément ton cas), toute la mémoire est prise, un traitement spécifique a besoin à un instant T de mémoire, le système va le mettre en swap ou mettre un swap un autre segment mémoire qu'il juge vieux mais qu'il ne peut libérer. Pour une raison X ou Y tu libères de la mémoire qui était dans la zone 'free' le système ne va pas forcément libérer celui qui a été affecté au swap s'il n'est sollicité par personne. Et dans ce cas la commande free indiquera de la mémoire libre et du swap utilisé, mais peut être que c'est en raison d'une configuration particulière passée. Dans le même genre, la commande suivante permet de voir qu'elle est réellement à un instant T la mémoire réellement utilisée, pas seulement celle réservée, mais celle dites "active", à comparer avec le "free -m" (le cat /proc/meminfo le donne aussi) :

```
genduf ~ # vmstat -s -S M | grep mem

         3793 M total memory

         2140 M used memory

         1169 M active memory

          613 M inactive memory

         1652 M free memory

          223 M buffer memory

genduf ~ # free -m

             total       used       free     shared    buffers     cached

Mem:          3793       2127       1666          0        223       1194

-/+ buffers/cache:        709       3084

Swap:         1035          0       1035

```

Maintenant le point important dans tout ça, de mon point de vue en tout cas : 

- Dédier un espace (ou pas) de swap en affectant une partition par exemple, chez toi cela pourrait être /dev/sda3, afin de creuser le sujet voir identifier un coupable à une consommation de mémoire swap.

- Mettre en place une métrologie permettant d'identifier qui swap => Pour ça il existe différents outils, le plus simple et facile à utiliser est vmstat. Il suffit de le lancer dans un terminal/console en indiquant un intervalle de prise de mesure (en secondes).

En général on obtient une sortie du type : 

```
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----

 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa

 0  0      0 1772024 226012 1155908    0    0    86   106   58  322  3  2 93  2

 0  0      0 1772148 226020 1156184    0    0   128    36  152  278  1  2 97  0

 0  0      0 1764336 226020 1164652    0    0     0     0  126  250  1  2 97  0

 0  0      0 1760616 226028 1167348    0    0   128   102  233 1115  2  2 96  0

 0  0      0 1770288 226028 1156808    0    0   128     0  242 1077  2  2 96  0

 0  0      0 1769800 226028 1156712    0    0     0     0  304 1493  3  2 95  0

 0  0      0 1769188 226040 1157248    0    0   256    42  242 1300  2  2 96  0

 0  0      0 1768800 226040 1157288    0    0     0     0  312 1657  2  2 96  0

 0  0      0 1768676 226048 1157536    0    0   128    60  286 1451  2  2 96  0

 0  0      0 1768428 226048 1157984    0    0   128     0  278 1465  2  2 96  0

 1  0      0 1767064 226056 1158048    0    0   128   100  325 1567  3  2 95  0

 0  0      0 1766420 226056 1158056    0    0     0     4  335 1654  2  2 96  0

 0  0      0 1766296 226056 1158312    0    0   128     0  225 1119  2  2 96  0

 0  0      0 1765676 226068 1158592    0    0   128    38  284 1395  2  2 96  0

 0  0      0 1765552 226068 1158576    0    0     0     0  364 1862  2  3 95  0

 0  0      0 1765056 226068 1159124    0    0   256     0  232 1253  2  2 96  0

 1  0      0 1764560 226076 1159088    0    0     0    22  306 1644  3  2 95  0

 1  0      0 1764560 226076 1159344    0    0   128     0  344 1655  3  2 95  0

 0  0      0 1761956 226084 1159532    0    0    94   104  315 1561  2  3 95  0

 0  0      0 1761212 226084 1159484    0    0     0     0  325 1640  2  3 95  0

 1  0      0 1760468 226084 1159460    0    0     0     0  376 1845  2  3 95  0

 0  0      0 1760344 226096 1159532    0    0     0    40  356 1783  3  2 95  0

 0  0      0 1774604 226108 1171756    0    0   120     0  310 1264  2  3 95  0

```

Les 2 colonnes qui vont nous intéresser sont 'si' et 'so' pour swapin et swapout, en gros les pages qu'il écrit et qu'il sort de l'espace swap. Attention je crois que le swapout correspond à ce qui est écrit en swap, à vérifier  :Smile:  Donc si quand tu boot ton swap est à 0 et qu'avec cette commande tu vois de l'activité si/so et que ton swap se remplit, alors effectivement tu as un élément qui génère du swap.

L'étape suivante est d'identifier pourquoi à un moment donné il y a ce swap ou qui se retrouve en swap.

Pour ça il y a plusieurs possibilités mais ça devient plus compliqué car faut d'abord déterminer ce qu'on cherche. Mais c'est à coup de top, pmap etc. Voir si c'est un noyau récent, utiliser 'perf' ( http://perf.wiki.kernel.org/ ) mais pour l'instant je n'ai pas encore eu l'occastion de pratiquer ce qui est bien dommage car j'ai toujours les outils solaris DTT bien sympathiques.

Pour résumer, la première question est : ton système génère-t-il du swap ?

----------

