Come rilevare una perdita di memoria?


16

Mi sembra che ci sia una maggiore perdita di memoria sul mio attuale sistema Ubuntu

Dopo aver segnalato strani errori di memoria di Eclipse ( /ubuntu/148998/eclipse-constant-different-out-of-memory-errors ) ho iniziato a ricevere messaggi di errore "Memoria insufficiente" nella mia console oggi - mentre fare semplici compiti come digitare sudo -s- o anche -free -m

Digitare 'free -m' ripetutamente mi ha mostrato come la mia RAM sale rapidamente da 700M a 900M, crescendo fino alla dimensione di 2000M in pochi secondi (dopo aver liberato memoria con echo 3 > /proc/sys/vm/drop_caches)

Eclipse non è la causa, ho completamente ucciso il processo e il montone stava ancora salendo. Esiste un modo per rilevare da dove proviene la perdita? Non riesco nemmeno più ad aggiornare il mio sistema, dal momento che apt-get updatenon riesce (probabilmente perché ha memoria insufficiente)

utilizzando Ubuntu 11.10


Sono MOLTO felice di non essere pazzo. Ho avuto lo stesso problema dall'aggiornamento alla 13.10, ma ricordo di averlo con l'11.10. La domanda è: stai usando CrashPlan? Mi sembra di averlo ristretto a quello, semplicemente non so come ripararlo. Ho provato le modifiche alla memoria, ma non funziona. Spero che ti dia qualche indizio
semi-novizio il

Non ha senso forzare il kernel a rilasciare cache. Saranno svuotati e il loro spazio sarà recuperato comunque non appena sarà richiesta più memoria fisica altrimenti. Lo svuotamento forzato molto probabilmente è addirittura dannoso per le prestazioni complessive, poiché gli oggetti non memorizzati nella cache devono essere recuperati da una memoria secondaria molto più lenta. La memoria principale libera non è affatto una buona cosa. È un segno di cattiva gestione della cache o di utilizzo molto leggero.
David Foerster,

Risposte:


9

memprof è uno strumento per la profilazione dell'utilizzo della memoria e la ricerca di perdite di memoria. Può generare un profilo quanta memoria è stata allocata da ciascuna funzione nel programma. Inoltre, può scansionare la memoria e trovare blocchi che hai allocato ma a cui non fai più riferimento da nessuna parte.

memprof funziona pre-caricando una libreria per sovrascrivere le funzioni di allocazione della memoria della libreria C e non richiede di ricompilare il programma.

memprof

Fonte: Manuale di Ubuntu


11

Innanzitutto, assicurati di avere a disposizione una cartella temporanea che abbia abbastanza spazio libero. I seguenti comandi creano dump che possono avere dimensioni di diversi GB.

È possibile creare una nuova cartella tmp utilizzando il seguente comando. Potresti voler passare /tmpa un file system diverso con spazio sufficiente

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

I passaggi per trovare la perdita di memoria

  1. Scopri il PID del processo che causa la perdita di memoria (puoi anche usarlo, ad esempio, htopse disponibile) e archiviarlo in una variabile chiamatapid

    ps -aux
    
  2. Dato che il PID è disponibile nella variabile pid, è possibile acquisire il consumo di memoria utilizzando /proc/$pid/smapse salvare in alcuni file come beforeMemInc.txt.

    cat /proc/$pid/smaps > $TMPDIR/beforeMemInc.txt
    
  3. Attendere qualche istante affinché il consumo di memoria aumenti.
  4. Cattura di /proc/$pid/smapsnuovo e salvalo comeafterMemInc.txt

    cat /proc/$pid/smaps > $TMPDIR/afterMemInc.txt
    
  5. Trova la differenza tra primo smapse secondo smaps, ad es. Con

    diff -u $TMPDIR/beforeMemInc.txt $TMPDIR/afterMemInc.txt
    
  6. Annotare l'intervallo di indirizzi in cui è stata aumentata la memoria, ad esempio:

       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. Utilizzare GDB per scaricare la memoria durante il processo in esecuzione o ottenere il coredump utilizzando

    gcore -o $TMPDIR/process $PID
    
  8. Ho usato gdb sul processo in esecuzione per scaricare la memoria su alcuni file.

    cd $TMPDIR
    gdb -p $pid
    dump memory memory.dump 0x2b3289290000 0x2b3289343000
    
  9. Ora, usa il stringscomando o hexdump -Cper stampare ilmemory.dump

    strings memory.dump
    

    Da questo ottieni informazioni leggibili che ti aiutano a individuare quelle stringhe nel tuo codice sorgente.

  10. Analizza la tua fonte per trovare la perdita.

Sono in un contenitore Docker e viene visualizzato un errore Autorizzazione negata durante l'esecuzione cat /proc/2882/smaps > /tmp/before.txtal passaggio 2. Che cosa ho fatto di sbagliato?
Devy,

8

Il trucco drop_cache non libererà memoria, ripristinerà la cache. Utilizza il comando ps se si desidera identificare quali processi utilizzano più memoria.

Ad esempio per monitorare l'elenco dei primi 15 utenti di memoria residenti.

$ 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

Puoi anche controllare la prenotazione della memoria condivisa ma saprai solo chi è il proprietario dei segmenti.

Allocazione 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

si noti che le allocazioni riservate sono molto più alte rispetto alle pagine allocate reali (df 'usato')

Allocazioni di sistema 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         

Modifica : è necessario passare --sort -rssper psottenere i processi con il maggior utilizzo di memoria, altrimenti l'elenco dei processi viene ordinato in modo numerico crescente e fornisce i processi con il minor utilizzo di memoria.


5

Ho una macchina più vecchia che uso che sputa costantemente messaggi di perdita di memoria:

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

La mia sceneggiatura:

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

L'ho chiamato 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

Potete vedere che ero sceso a 374 MB, ho eseguito il sync; sudo echo 3 > /proc/sys/vm/drop_cachese ho guadagnato 417 MB. Uno può cronfarlo ogni 5 minuti o avere solo un terminale aperto ed eseguirlo quando vedi prestazioni lente. Sì, devo aggiungere memoria alla macchina ...


La formattazione sembra essere un problema, non sono sicuro di come risolvere
Warpig,

1
Usa il link di modifica sotto il tuo post. C'è una barra degli strumenti di formattazione e un punto interrogativo arancione sopra l'area di testo che collega la guida alla formattazione di Markdown .
David Foerster,

Si prega di dare un'occhiata al mio recente commento sulla domanda . Sono convinto che l'idea di liberare la memoria principale scaricando e rilasciando cache sia sbagliata e so di non essere sola con questa conclusione.
David Foerster,

Mille grazie, David ... Sono completamente d'accordo sul fatto che svuotare / rilasciare la cache sia errato ... Ma qualcosa si blocca e rende il blocco / blocco della macchina ... Sono solo sconcertato su cosa sia, pensando che sia un problema di Firefox. ..
Warpig

3

memstat è anche un buon strumento che mostrerà la quantità di memoria utilizzata da ciascun blocco e la quantità di memoria utilizzata dalle librerie caricate. Non è lo strumento migliore, ma vale la pena utilizzarlo per raccogliere dettagli e statistiche.

memstat -w -p pid è un buon comando da usare.


1
il collegamento è interrotto, penso che questo sia buono
Vladkras,

1

Ho avuto un problema simile ma con una soluzione molto strana.

Per qualche ragione sconosciuta avevo un server di posta sul mio laptop configurato e funzionante. Non so perché l'ho avuto ... Tuttavia ho chiuso il suo servizio e si è scoperto che quel software sul mio laptop era sotto attacco ddos. Dopodiché tutto è stato normale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.