Comment détecter une fuite de mémoire?

16

Je semble avoir une fuite de mémoire plus importante sur mon système Ubuntu actuel

Après avoir signalé d'étranges erreurs de mémoire Eclipse ( /ubuntu/148998/eclipse-constant-different-out-of-memory-errors ), j'ai commencé à recevoir des messages d'erreur `` Pas assez de mémoire '' dans ma console aujourd'hui - tout en faire des tâches simples comme taper sudo -s- ou même -free -m

Taper 'free -m' m'a montré de façon répétée comment ma RAM passe rapidement de 700M à 900M, atteignant la taille de 2000M en quelques secondes (après avoir libéré de la mémoire avec echo 3 > /proc/sys/vm/drop_caches )

Eclipse n'est pas la cause, j'ai complètement tué le processus et le bélier montait toujours. Existe-t-il un moyen de détecter d'où provient la fuite? Je ne peux même plus mettre à jour mon système, carapt-get update échoue (probablement parce qu'il manque de mémoire)

En utilisant Ubuntu 11.10

Katai
la source
Je suis TRÈS content je ne suis pas fou. J'ai eu le même problème depuis la mise à niveau vers 13.10, mais je me souviens l'avoir avec 11.10. La question est: utilisez-vous CrashPlan? Il me semble que cela se réduit à cela, je ne sais tout simplement pas comment y remédier. J'ai essayé les réglages de mémoire, mais cela ne fonctionne pas. J'espère que cela vous donne des indices
semi-débutant
Cela ne sert à rien de forcer le noyau à supprimer les caches. Ils seront vidés et leur espace récupéré de toute façon dès qu'il faudra plus de mémoire physique autrement. Les rincer de force est très probablement même préjudiciable aux performances globales, car les objets non mis en cache doivent être récupérés à partir d'un stockage secondaire beaucoup plus lent. La mémoire principale libre n'est en aucun cas une bonne chose. C'est soit un signe de mauvaise gestion du cache, soit une utilisation très légère.
David Foerster

Réponses:

9

memprof est un outil pour profiler l'utilisation de la mémoire et trouver les fuites de mémoire. Il peut générer un profil de la quantité de mémoire allouée par chaque fonction de votre programme. En outre, il peut analyser la mémoire et trouver les blocs que vous avez alloués mais qui ne sont plus référencés nulle part.

memprof fonctionne en préchargeant une bibliothèque pour remplacer les fonctions d'allocation de mémoire de la bibliothèque C et ne vous oblige pas à recompiler votre programme.

memprof

Source: Manuel Ubuntu

Mitch
la source
11

Tout d'abord, assurez-vous d'avoir un dossier temporaire disponible qui a suffisamment d'espace libre. Les commandes suivantes créent des vidages dont la taille peut atteindre plusieurs Go.

Vous pouvez créer un nouveau dossier tmp à l'aide de la commande suivante. Vous souhaiterez peut-être passer /tmpà un autre système de fichiers avec suffisamment d'espace

TMPDIR=$(mktemp -d -t -p /tmp)

Étapes pour trouver une fuite de mémoire

  1. Découvrez le PID du processus qui provoque la fuite de mémoire (vous pouvez également l'utiliser par exemple htopsi disponible) et stockez-le dans une variable appeléepid

    ps -aux
    
  2. Étant donné que le PID est disponible dans la variable pid, vous pouvez capturer la consommation de mémoire en utilisant /proc/$pid/smapset enregistrer dans un fichier comme beforeMemInc.txt.

    cat /proc/$pid/smaps > $TMPDIR/beforeMemInc.txt
    
  3. Attendez un peu que la consommation de mémoire augmente.
  4. Capturez à /proc/$pid/smapsnouveau et enregistrez-le sousafterMemInc.txt

    cat /proc/$pid/smaps > $TMPDIR/afterMemInc.txt
    
  5. Trouvez la différence entre le premier smapset le deuxième smaps, par exemple avec

    diff -u $TMPDIR/beforeMemInc.txt $TMPDIR/afterMemInc.txt
    
  6. Notez la plage d'adresses où la mémoire a été augmentée, par exemple:

       beforeMemInc.txt            afterMemInc.txt
    ---------------------------------------------------
    2b3289290000-2b3289343000   2b3289290000-2b3289343000  #ADDRESS
    Shared_Clean:    0 kB       Shared_Clean:    0 kB          
    Shared_Dirty:    0 kB       Shared_Dirty:    0 kB
    Private_Clean:   0 kB       Private_Clean:   0 kB
    Private_Dirty:  28 kB       Private_Dirty:  36 kB  
    Referenced:     28 kB       Referenced:     36 kB
    Anonymous:      28 kB       Anonymous:      36 kB  #INCREASE MEM
    AnonHugePages:   0 kB       AnonHugePages:   0 kB
    Swap:            0 kB       Swap:            0 kB
    KernelPageSize:  4 kB       KernelPageSize:  4 kB
    MMUPageSize:     4 kB       MMUPageSize:     4 kB
    Locked:          0 kB       Locked:          0 kB
    VmFlags: rd wr mr mw me ac  VmFlags: rd wr mr mw me ac
    
  7. Utilisez GDB pour vider la mémoire sur le processus en cours d'exécution ou obtenir le coredump en utilisant

    gcore -o $TMPDIR/process $PID
    
  8. J'ai utilisé gdb sur le processus en cours pour vider la mémoire dans un fichier.

    cd $TMPDIR
    gdb -p $pid
    dump memory memory.dump 0x2b3289290000 0x2b3289343000
    
  9. Maintenant, utilisez la stringscommande ou hexdump -Cpour imprimer lememory.dump

    strings memory.dump
    

    De là, vous obtenez des informations lisibles qui vous aident à localiser ces chaînes dans votre code source.

  10. Analysez votre source pour trouver la fuite.
Jagannath Pattar
la source
Je suis dans un conteneur Docker et j'obtiens une erreur Autorisation refusée lors de l'exécution cat /proc/2882/smaps > /tmp/before.txtà l'étape 2. Qu'est-ce que j'ai fait de mal?
Devy
8

L'astuce drop_cache ne libérera pas de mémoire, elle réinitialisera le cache. Utilise la commande ps si vous souhaitez identifier les processus qui utilisent le plus de mémoire.

Par exemple, pour surveiller la liste des 15 premiers utilisateurs de mémoire résidents.

$ watch "ps --sort -rss -eo pid,pmem,rss,vsz,comm | head -16"
  PID %MEM   RSS    VSZ COMMAND
 2590 13.4 136892 825000 firefox
 1743 10.7 109020 300780 Xorg
 2067  8.5 86764 1118140 unity-2d-shell
 3307  4.1 42560 627780 unity-2d-spread
 2068  2.9 29904 617644 unity-2d-panel
 2092  2.5 25524 1291204 nautilus
 2457  1.9 20292 530276 gnome-terminal
 2351  1.9 20016 821488 unity-scope-vid
 2161  1.9 19476 531968 unity-panel-ser
 2034  1.7 18256 759716 gnome-settings-
 2074  1.5 16176 518016 nm-applet
 2273  1.5 15452 580416 unity-lens-vide
 2051  1.4 15112 524260 metacity
 2395  1.2 12836 407336 update-notifi

Vous pouvez également vérifier la réservation de mémoire partagée, mais vous ne saurez que qui est le propriétaire des segments.

Allocation Pmap:

$ ls -l /run/shm
total 272
-r-------- 1 ed      ed      67108904 Nov 29 18:17 pulse-shm-1884617860
-r-------- 1 lightdm lightdm 67108904 Nov 29 18:11 pulse-shm-2352897759
-r-------- 1 ed      ed      67108904 Nov 29 18:12 pulse-shm-3444873503
-r-------- 1 ed      ed      67108904 Nov 29 18:12 pulse-shm-3485341848
-r-------- 1 lightdm lightdm 67108904 Nov 29 18:11 pulse-shm-535843976
-r-------- 1 ed      ed      67108904 Nov 29 19:12 pulse-shm-789046959
-r-------- 1 ed      ed      67108904 Nov 29 18:38 pulse-shm-863909656

$ df /run/shm 
Filesystem     1K-blocks  Used Available Use% Mounted on
none              509332   272    509060   1% /run/shm

notez que les allocations réservées sont beaucoup plus élevées que les pages réelles allouées (df 'utilisé')

Allocations du système V:

$ ipcs -m 

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 294912     ed         700        122880     2          dest         
0x00000000 327681     ed         700        4823040    2          dest         
0x00000000 491522     ed         600        393216     2          dest         
0x00000000 589827     ed         700        4578120    2          dest         
0x00000000 425988     ed         700        27852      2          dest         
0x00000000 458757     ed         600        393216     2          dest         

Modifier : vous devez passer --sort -rssà pspour obtenir les processus qui utilisent le plus de mémoire, sinon la liste des processus est triée en augmentant le nombre et donne les processus avec le moins d’utilisation de mémoire.

Emmanuel
la source
5

J'ai une machine plus ancienne que j'utilise qui crache constamment des messages de fuite de mémoire:

root@:~# free -m
             total       used       free     shared    buffers     cached
Mem:          1898       1523        374        131         32        588
-/+ buffers/cache:        902        995
Swap:         1942        480       1462

Mon script:

sync; sudo echo 3 > /proc/sys/vm/drop_caches

Nommé cache.sh

root@~# ./cache.sh
root@~# free -m
             total       used       free     shared    buffers     cached
Mem:          1898       1106        791        126          1        207
-/+ buffers/cache:        897       1000
Swap:         1942        480       1462

Vous pouvez voir que je suis tombé à 374 Mo, que j'ai couru sync; sudo echo 3 > /proc/sys/vm/drop_cacheset gagné 417 Mo en arrière. On peut l' cronexécuter toutes les 5 minutes ou simplement ouvrir un terminal et l'exécuter lorsque vous voyez des performances ralenties. Oui, je dois ajouter de la mémoire à la machine ...

Warpig
la source
Le formatage semble être un problème,
je
1
Utilisez le lien d' édition sous votre message. Il y a une barre d'outils de mise en forme et un point d'interrogation orange au-dessus de la zone de texte reliant à l' aide de mise en forme Markdown .
David Foerster
Veuillez consulter mon récent commentaire sur la question . Je suis convaincu que l'idée de libérer la mémoire principale en vidant et en laissant tomber les caches est erronée et je sais que je ne suis pas seul avec cette conclusion.
David Foerster
Merci beaucoup, David ... Je suis totalement d'accord pour vider / supprimer le cache est erroné ... Mais quelque chose se bloque et fait geler / verrouiller la machine ... Juste déconcerté quant à ce que c'est, pensant que c'est un problème de Firefox. ..
Warpig
3

memstat est également un bon outil qui montrera la quantité de mémoire utilisée par chaque bloc ainsi que la quantité de mémoire utilisée par les bibliothèques chargées. Ce n'est pas le meilleur outil mais vaut la peine d'être utilisé pour recueillir des détails et des statistiques.

memstat -w -p pid est une bonne commande à utiliser.

Chef Pharaon
la source
1
le lien est cassé, je pense que celui-ci est bon
vladkras
1

J'ai eu un problème similaire mais avec une solution très bizarre.

Pour une raison inconnue, j'avais un serveur de messagerie sur mon ordinateur portable configuré et en cours d'exécution.Je ne sais pas pourquoi je l'avais ... Cependant, j'ai fermé son service et il s'est avéré que ce logiciel sur mon ordinateur portable était sous une attaque ddos. Après cela, tout était normal.

Mario Kamenjak
la source