Utilisation de la mémoire sous Linux

Je vois surtout le swap qui se remplit. Fuite de mémoire ?

Bonjour,

Effectivement il y a un gros usage du swap. Parmi les applications visibles dans le retour de la commande top, signal-desktop est un coupable idéal :

On peut ajouter l’affichage de l’utilisation du swap par chaque processus dans top.
Appuyer sur f pour entrer dans la gestion de champs.
Descendre le curseur sur « SWAP ».
Appuyer sur d pour le sélectionner comme colonne à afficher.
Appuyer sur flèche droit puis flèche haut pour déplacer le champ à côté de RES.
Appuyer sur Entrée pour valider la position.
Appuyer sur s pour trier sur la colonne.
Appuyer sur q pour revenir à l’affichage des processus.

1 J'aime

Effectivement il y a aussi l’occupation du swap qui me parait également énorme puisque 7 Gb utilisé.

J’ai fermé signal-desktop et voici le retour de free maintenant:

               total        used        free      shared  buff/cache   available
Mem:           7.7Gi       3.4Gi       1.4Gi       1.4Gi       2.9Gi       2.6Gi
Swap:          7.9Gi       6.2Gi       1.7Gi

On voit que ça a libéré un peu de mémoire swap mais pas tant que ça (et j’ai toujours ces 3 Gb de buff/cache qui ne descendent jamais).

Il serait effectivement intéressant de voir qui utilise le swap, voici l’affichage de top suite à la manip de Pascal:

top - 12:23:42 up 31 days, 14:37,  8 users,  load average: 1.34, 1.56, 1.14
Tasks: 303 total,   1 running, 302 sleeping,   0 stopped,   0 zombie
%Cpu(s):  4.3 us,  3.6 sy,  0.0 ni, 91.1 id,  0.0 wa,  0.0 hi,  1.0 si,  0.0 st
MiB Mem :   7849.2 total,   1182.9 free,   3786.9 used,   2879.3 buff/cache
MiB Swap:   8131.0 total,   1940.0 free,   6191.0 used.   2130.6 avail Mem 

    PID USER      PR  NI    VIRT    RES   SWAP    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                         
   1435 turman    20   0 4310812  25400   1.4g   2136 S   0.0   0.3  95:29.19 akonadiserver                                                                   
   8262 turman    20   0 7747656 269468 682904  86044 S   0.0   3.4 249:18.34 soffice.bin                                                                     
   1315 turman    20   0 4907900 246984 558636  49460 S   2.0   3.1   2451:07 plasmashell                                                                     
1872143 turman    20   0 8515492 186336 438120  30676 S   0.3   2.3  47:11.93 skrooge                                                                         
   2077 turman    20   0 2436240  31356 378700   6824 S   0.3   0.4  74:17.12 akonadi_imap_re                                                                 
   1646 turman    20   0 3084824  24800 317596   5788 S   0.0   0.3 165:43.86 mysqld                                                                          
   1414 turman    20   0 4505236 197592 298212  12520 S   0.3   2.5 132:16.27 nextcloud                                                                       
2554621 turman    20   0 3570676 365612 144260 157000 S   0.3   4.5  81:41.29 Web Content                                                                     
    893 root      20   0 1880328 284384  92856 242804 S  11.6   3.5 437:26.72 Xorg                                                                            
2542576 turman    20   0 5194452 836596  81948 313728 S   1.7  10.4 351:56.15 firefox-esr                                                                     
2785799 turman    20   0 3826556 728268  75304 340244 S   1.0   9.1  28:33.86 Web Content                                                                     
2555128 turman    20   0 3723112 146644  65540  68072 S   0.0   1.8   1:46.97 kontact                                                                         
2542695 turman    20   0 3440640 263960  55964 125736 S   0.3   3.3  39:28.65 Web Content                                                                     
2542640 turman    20   0 3251472 279924  52240  78764 S   0.3   3.5 103:11.17 Web Content                                                                     
   1351 turman    20   0 2256544  56504  51432  10224 S   0.0   0.7  42:07.65 korgac                                                                          
2542669 turman    20   0 3247892 248736  50744  76100 S   1.0   3.1  46:26.70 Web Content                                                                     
   2093 turman    20   0  522104   5152  49172   1348 S   0.0   0.1   8:46.31 akonadi_notes_a                                                                 
2542714 turman    20   0 3015168 224700  39724 146448 S   0.0   2.8  31:03.29 Web Content                                                                     
2542740 turman    20   0 3251100 201432  37248 121156 S   0.0   2.5   9:38.42 Web Content                                                                     
   1233 turman    20   0 3992912  84120  34160  25192 S   8.3   1.0 351:18.23 kwin_x11                                                                        
3032431 turman    20   0 2140740  34924  32532  26048 S   0.0   0.4   0:07.54 kinfocenter                                                                     
1421489 turman    20   0 1676076  80420  32496  45564 S   0.3   1.0   5:45.12 dolphin                                                                         
   2081 turman    20   0 1141524   5704  28488   3944 S   0.0   0.1   1:41.15 akonadi_mailfil                                                                 
   2098 turman    20   0 1066752   2132  25840   1176 S   0.0   0.0   1:33.56 akonadi_unified                                                                 
   1538 turman    20   0  249064  11404  25320   5332 S   0.0   0.1  28:46.11 wicd-client                                                                     
   2074 turman    20   0 1141324   5520  24404   1936 S   0.0   0.1   1:41.97 akonadi_archive                                                                 
   1716 turman    20   0 1298172   6288  23604   2824 S   0.0   0.1   0:25.87 kwalletd5                                                                       
   1356 root      20   0  364164   9596  22724   2744 S   0.0   0.1   2:08.76 packagekitd                                                                     
   2078 turman    39  19  402876   8000  22060   5040 S   0.0   0.1   2:22.27 akonadi_indexin 

C’est très intéressant !

Akanodiserver est connu pour ses fuites mémoires, d’habitude j’ai même un script qui le redémarre toutes les heures mais là j’avais oublié de le lancer. En tuant le process j’ai récupéré carrément 2 Gb de swap (alors que top disait qu’il n’utilisait « que » 1.4 Gb):

               total        used        free      shared  buff/cache   available
Mem:           7.7Gi       3.6Gi       1.4Gi       1.6Gi       2.7Gi       2.2Gi
Swap:          7.9Gi       4.1Gi       3.9Gi

Après avoir quitté LibreOffice (soffice.bin était le 2e process qui utilisait le plus de swap) j’ai récupéré 600 Mb en plus de swap, ce qui pour le coup correspondait bien à l’affichage de top:

               total        used        free      shared  buff/cache   available
Mem:           7.7Gi       3.5Gi       1.5Gi       1.5Gi       2.7Gi       2.4Gi
Swap:          7.9Gi       3.4Gi       4.5Gi

Donc ok, au bout d’un mois dans reboot, j’avais donc quelques process qui abusaient clairement de la mémoire swap. J’imagine que l’on peut parler de fuite mémoire pour Akonadi ou LibreOffice.

Mais ça veut donc dire que l’espace swap utilisé par les processus ne se visualise pas dans la colonne « mémoire » de l’activité système de KDE (ksysguard) où aucun process ne dépassent les 500 Mb. A croire qu’il ne compte que la mémoire résidente en mémoire physique, toute comme la colonne RES de top (les valeurs sont un peu différentes quand même). C’est dommage qu’il n’y ait pas un moyen simple de voir toute la mémoire vraiment utilisée par les processus, quelle soit en RAM ou en swap.

La bonne nouvelle c’est que maintenant 2.4 Gb sont available pour 1.5 Gb de free. Une partie importante de buff/cache semble donc maintenant être « récupérable » (près de 1 Gb sur 2.7 Gb). Mais je ne comprend toujours pas pourquoi ça ne serait pas l’intégralité (ou presque) qui pourrait être récupérable puisque ça n’est que de la cache…

Pour moi, non.
Les programmes et bibliothèques qui sont placés en swap sont ceux qui sont les moins utilisés.

Si tu veux savoir quelle application sature la mémoire il faut surveiller son occupation au cours du temps.

Il est incorrect de dire qu’un processus abuse du swap. Un processus ne voit que sa mémoire virtuelle, il ne sait pas si une page est en RAM, en swap, les deux (swapcache), mappée à partir d’un fichier (notamment binaire exécutable ou bibliothèque) ou pas allouée du tout (jamais utilisée). Il peut seulement demander qu’une page ne soit pas swappée, par exemple parce qu’elle contient des données sensibles (clé secrète…) qui ne doivent pas être écrites dans le swap.

Pour dire s’il s’agit d’une fuite de mémoire, il faut savoir si cette occupation mémoire est normale ou non, si elle augmente avec l’uptime ou pas…

Je ne sais pas à quoi sert akonadiserver, mais 1,4 Go de mémoire ça me paraît quand même beaucoup. Ce qui est curieux, c’est que le processus occupe très peu de mémoire résidente en comparaison (25 Mo) donc soit il n’utilise jamais les données qui sont en swap (et il peut s’agir de fuite), soit il est lui-même inactif. Même remarque pour mysqld.

Que LibreOffice ait desfuites de mémoire, ça ne me choque pas vraiment de la part d’une usine à gaz qui n’a pas vocation à tourner en permanence.

En première approximation on peut additionner RES+SWAP, mais ça reste une approximation. La gestion de la mémoire est quelque chose d’extrêmement complexe en partie à cause de toutes les optimisations mises en oeuvre, et il est difficile d’évaluer la quantité de mémoire occupée par un processus. Une partie de la mémoire résidente peut être à la fois en RAM et dans le swap (swapcache), partagée avec d’autres processus (mémoire partagée, bibliothèques partagées, fichiers mappés…)

Non, ce n’est pas « que du cache » qu’on peut jeter à tout moment. Comme je l’ai écrit, le cache contient aussi tous les fichiers mappés dans la mémoire virtuelle des processus, ce qui inclut notamment les portions des binaires exécutables et les bibliothèques partagées qu’ils utilisent. J’ignore dans quelle mesure cette partie du cache est récupérable. Il y a aussi le contenu « sale » (modifications du système de fichiers en attente d’écriture sur disque) mais il me semble qu’un sync devrait le réduire.

Aussi, par défaut depuis Debian stretch free additionne le cache et les buffers dans une même colonne. En général le cache est bien plus gros que les buffers, mais ces derniers peuvent grossir lorsqu’il y a de l’activité disque. Pour les afficher séparément il faut ajouter l’option -w.

Désolé d’insister mais le premier retour montre bien qu’il y a un problème avec signal-desktop.

4682 turman    20   0   37,2g 288500  68592 S  24,8   3,6   7719:45 signal-desktop

Je ne suis pas assez calé en matière de gestion de la mémoire, mais AMHA le fait qu’une application utilise le swap n’indique en rien qu’elle présente une fuite mémoire.
Pour moi, si une application présente une fuite mémoire elle va réclamer de la RAM sans en libérer et le système va déplacer les pages mémoire peu ou pas utilisées vers le swap, donc a priori celle des autres applications .

Si tu fais allusion aux 37 Go de mémoire virtuelle, je t’accorde que ça me paraît complètement délirant mais ça reste de la mémoire virtuelle, donc potentiellement du vide. La mémoire résidente n’est « que » de 288 Mo et on ne voit pas le swap.

Certes, mais ça peut être un signe, surtout si les données mises en swap n’en sortent jamais, signe que le processus ne les utilise pas.

Dans un premier temps, oui. Ensuite quand le système va à nouveau avoir besoin de réclamer de la mémoire, il va voir que les pages liées à la fuite ne sont jamais utilisées et les swapper à leur tour.

Oui c’est bien à cela que je faisais allusion.
J’ai regardé sur une machine de bureau et j’ai trouvé un processus (Firefox webextensions) qui occupe plus de 24 Go de mémoire virtuelle.
Ce n’est donc pas exceptionnel. Mais j’ai du mal à comprendre ce concept de mémoire virtuelle et la page de man de top en donne une explication plus que succincte.
Merci pour tes explications complémentaires.

Concernant akonadi je l’utilise depuis des années (c’est un composant de kmail/kontact) et je n’ai jamais constaté de fuite mémoire.

La mémoire virtuelle est avant tout un concept, un mode de fonctionnement des processeurs et systèmes d’exploitation « modernes » comme Linux, qui permet l’isolation des processus et la gestion efficace de la mémoire. Chaque processus « voit » un espace d’adressage virtuel indépendant des autres processus et de l’espace d’adressage de la mémoire physique (autrement dit, le contenu de la mémoire à l’adresse X d’un processus n’a potentiellement rien à voir avec le contenu de la mémoire à la même adresse d’un autre processus ou de la mémoire physique).

Dans cet espace d’adressage virtuel, le noyau « mappe » tout ce dont le processus a besoin :

  • le programme exécutable
  • les bibliothèques partagées
  • les fichiers de données mappés en mémoire (moyen alternatif aux entrées-sorties classiques pour l’accès à un fichier, cf. mmap)
  • la mémoire de travail du processus
  • les données swappées
  • la mémoire partagée avec d’autres processus à des fins de communication ou synchronisation
    j’en oublie peut-être d’autres

Tout cela constitue ce qui est compté comme la mémoire virtuelle. Cependant l’occupation réelle peut être inférieure car seules les zones de mémoire de travail ou des fichiers mappés auxquelles le processus a accédé occupent réellement de la mémoire. En effet le noyau alloue la mémoire pour une page donnée seulement lors du premier accès à celle-ci. Cela évite les entrées-sorties (dans le cas d’un fichier mappé) et les allocations de mémoire inutiles. D’autre part le noyau fait de l’« overcommit » : il peut allouer plus de mémoire virtuelle qu’il n’y a de mémoire physique disponible, en pariant sur le fait que les processus n’utiliseront pas toute la mémoire qu’ils ont demandée.

2 J'aime

Merci pour ces infos, c’est très intéressant.

Après avoir donc fermé les applications qui consommaient le plus de swap je me retrouve dans un état pas trop mal:

               total        used        free      shared  buff/cache   available
Mem:           7.7Gi       3.2Gi       840Mi       1.5Gi       3.6Gi       2.6Gi
Swap:          7.9Gi       403Mi       7.5Gi

Je suis bien content d’avoir cette astuce pour voir la swap consommée par processus dans top, et du coup pouvoir estimer la taille de mémoire occupée par chacun d’entre eux en additionnant swap+ res. C’est pas ultra pratique mais il doit y avoir moyen de configurer top pour au moins avoir l’affichage de la colonne swap par défaut.

Pour revenir à mes différentes sorties de free j’ai quand même une question ultra basique: pourquoi total != used + free ? Dans mon cas on dirait qu’il faut rajouter buffer/cache pour arriver au total mais pour moi used est censé contenir tout ce qui n’est pas free, y compris le buffer/cache.

C’est la définition même de la valeur « used » figurant dans la page de manuel de free:

used Used memory (calculated as total - free - buffers - cache )

Effectivement. J’ai été feinté par la page postée plus haut où on peut voir cette sortie de free où total = used + free:

  $ free -m
                total        used        free      shared  buff/cache   available
  Mem:           1504        1491          13           0         855      792
  Swap:          2047           6        2041

Surprenant n’est ce pas ?

Oui, ça correspond à la valeur de « used » affichée par les anciennes versions de free. Mais celles-ci n’affichaient pas de colonne « available » ni de colonne « buff/cache » combinée :

             total       used       free     shared    buffers     cached
Mem:          1,5G       1,2G       258M        44M        47M       351M
-/+ buffers/cache:       853M       657M
Swap:         954M       240M       714M

Intéressant, ça marche sur htop ?
(j’ai appuyé sur f et ça n’a rien donné)

Mais dans l’exemple de la page on dirait que c’est la version récente de free puisqu’on voit bien la colonne « available » ainsi que la colonne « buff/cache » combinée, le tout sur la ligne de « Mem: » :thinking:

Bonjour,

Une fois l’affichage de la colonne swap configurée, faire Maj+w dans la fenêtre normale de top pour sauvegarder la config dans le fichier ~/.toprc

A+

1 J'aime

Je ne connais pas htop. Apparemment il faut passer par F2/Setup pour configurer les colonnes à afficher. Mais je ne vois pas la quantité de swap utilisée parmi les colonnes disponibles dans la page de manuel de buster. Elle ne fait son apparition que dans la version de testing/sid, mais c’est peut-être la page de manuel qui n’était pas à jour, ça peut arriver.

Oui, j’ai vu. Cependant la sortie des commandes free dans la page de tests dont le lien figure à la fin du document correspond bien à l’ancien format. Il se peut que la première page ait été mise à jour de façon incomplète pour prendre en compte le nouveau format. On peut voir que les deux formats cohabitaient dans la version initiale de la page importée dans github.

1 J'aime

Merci, c’est top ! :slight_smile:

Bien vu, on avait donc un mix des anciennes et nouvelles versions de free, forcément ça pouvait prêter à confusion. En tout cas ok, dans les versions récentes, la partie « used » n’englobe pas le « buff/cache » malgré son nom, alors que c’était le cas avant.

Pour revenir à ma situation, là maintenant free me renvoie:

                total        used        free      shared  buff/cache   available
 Mem:           7.7Gi       4.3Gi       596Mi       1.5Gi       2.8Gi       1.6Gi
 Swap:          7.9Gi       1.3Gi       6.7Gi

Rien de très anormal, c’est juste un peu frustrant d’avoir un aussi gros cache/buffer avec seulement une gros tiers qui est « récupérable » (1 Gb sur 2.8 Gb).

Cela dépasse les limites de mes connaissances. Peut-être plus d’indices dans /proc/meminfo dont free n’affiche qu’un extrait.