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
la source
Réponses:
memprof
Source: Manuel Ubuntu
la source
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Étapes pour trouver une fuite de mémoire
Découvrez le PID du processus qui provoque la fuite de mémoire (vous pouvez également l'utiliser par exemple
htop
si disponible) et stockez-le dans une variable appeléepid
Étant donné que le PID est disponible dans la variable
pid
, vous pouvez capturer la consommation de mémoire en utilisant/proc/$pid/smaps
et enregistrer dans un fichier commebeforeMemInc.txt
.Capturez à
/proc/$pid/smaps
nouveau et enregistrez-le sousafterMemInc.txt
Trouvez la différence entre le premier
smaps
et le deuxièmesmaps
, par exemple avecNotez la plage d'adresses où la mémoire a été augmentée, par exemple:
Utilisez GDB pour vider la mémoire sur le processus en cours d'exécution ou obtenir le coredump en utilisant
J'ai utilisé gdb sur le processus en cours pour vider la mémoire dans un fichier.
Maintenant, utilisez la
strings
commande ouhexdump -C
pour imprimer lememory.dump
De là, vous obtenez des informations lisibles qui vous aident à localiser ces chaînes dans votre code source.
la source
cat /proc/2882/smaps > /tmp/before.txt
à l'étape 2. Qu'est-ce que j'ai fait de mal?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.
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:
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:
Modifier : vous devez passer
--sort -rss
àps
pour 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.la source
J'ai une machine plus ancienne que j'utilise qui crache constamment des messages de fuite de mémoire:
Mon script:
Nommé
cache.sh
Vous pouvez voir que je suis tombé à 374 Mo, que j'ai couru
sync; sudo echo 3 > /proc/sys/vm/drop_caches
et gagné 417 Mo en arrière. On peut l'cron
exé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 ...la source
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.la source
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.
la source