¿Cómo detectar una pérdida de memoria?

16

Parece que tengo una pérdida de memoria mayor en mi sistema ubuntu actual

Después de informar extraños errores de memoria de Eclipse ( /ubuntu/148998/eclipse-constant-different-out-of-memory-errors ) Comencé a recibir mensajes de error de "Memoria insuficiente" en mi consola hoy, mientras haciendo tareas simples como escribir sudo -s, o inclusofree -m

Escribir 'free -m' repetidamente me mostró cómo mi RAM sube rápidamente de 700M a 900M, creciendo hasta el tamaño de 2000M en unos segundos (después de liberar memoria con echo 3 > /proc/sys/vm/drop_caches)

Eclipse no es la causa, eliminé completamente el proceso y el carnero todavía estaba subiendo. ¿Hay alguna forma de detectar de dónde viene la fuga? Ya ni siquiera puedo actualizar mi sistema, ya que apt-get updatefalla (probablemente porque no tiene memoria)

Utilizando Ubuntu 11.10

Katai
fuente
Estoy MUY feliz, no estoy loco. He tenido el mismo problema desde que actualicé a 13.10, pero recuerdo haberlo tenido con 11.10. La pregunta es: ¿Estás usando CrashPlan? Parece que lo reduje a eso, simplemente no sé cómo solucionarlo. He probado los ajustes de memoria, pero no funciona. Espero que te dé algunas pistas
semi-novato
No tiene sentido forzar al núcleo a soltar cachés. Se enjuagarán y su espacio se recuperará de todos modos tan pronto como se requiera más memoria física. Es muy probable que los eliminen a la fuerza incluso en detrimento del rendimiento general, ya que los objetos no almacenados en caché deben recuperarse de un almacenamiento secundario mucho más lento. La memoria principal libre de ninguna manera es algo bueno. Es una señal de mala gestión de caché o un uso muy ligero.
David Foerster

Respuestas:

9

memprof es una herramienta para perfilar el uso de memoria y encontrar pérdidas de memoria. Puede generar un perfil de la cantidad de memoria asignada por cada función en su programa. Además, puede escanear la memoria y encontrar bloques que haya asignado pero que ya no se mencionan en ningún lado.

memprof funciona precargando una biblioteca para anular las funciones de asignación de memoria de la biblioteca C y no requiere que vuelva a compilar su programa.

memprof

Fuente: Manual de Ubuntu

Mitch
fuente
11

Primero, asegúrese de tener una carpeta temporal disponible que tenga suficiente espacio libre. Los siguientes comandos crean volcados que pueden tener varios GB de tamaño.

Puede crear una nueva carpeta tmp con el siguiente comando. Es posible que desee cambiar /tmpa un sistema de archivos diferente con suficiente espacio

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

Pasos para encontrar la fuga de memoria

  1. Descubra el PID del proceso que causa la pérdida de memoria (también puede usar, por ejemplo, htopsi está disponible) y guárdelo en una variable llamadapid

    ps -aux
    
  2. Dado que el PID está disponible en la variable pid, puede capturar el consumo de memoria utilizando /proc/$pid/smapsy guardar en algún archivo como beforeMemInc.txt.

    cat /proc/$pid/smaps > $TMPDIR/beforeMemInc.txt
    
  3. Espere un tiempo para que aumente el consumo de memoria.
  4. Capture /proc/$pid/smapsnuevamente y guárdelo comoafterMemInc.txt

    cat /proc/$pid/smaps > $TMPDIR/afterMemInc.txt
    
  5. Encuentra la diferencia entre primero smapsy segundo smaps, por ejemplo, con

    diff -u $TMPDIR/beforeMemInc.txt $TMPDIR/afterMemInc.txt
    
  6. Anote el rango de direcciones donde aumentó la memoria, por ejemplo:

       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. Use GDB para volcar la memoria en el proceso en ejecución u obtenga el coredump usando

    gcore -o $TMPDIR/process $PID
    
  8. Usé gdb en el proceso en ejecución para volcar la memoria en algún archivo.

    cd $TMPDIR
    gdb -p $pid
    dump memory memory.dump 0x2b3289290000 0x2b3289343000
    
  9. Ahora, use el stringscomando o hexdump -Cpara imprimir elmemory.dump

    strings memory.dump
    

    De esto obtienes información legible que te ayuda a localizar esas cadenas en tu código fuente.

  10. Analice su fuente para encontrar la fuga.
Jagannath Pattar
fuente
Estoy en un contenedor Docker, obteniendo un error de Permiso denegado cuando ejecuto cat /proc/2882/smaps > /tmp/before.txtel paso 2. ¿Qué hice mal?
Devy
8

El truco drop_cache no liberará memoria, restablecerá el caché. Utiliza el comando ps si desea identificar qué procesos usan más memoria.

Por ejemplo, para monitorear la lista de los 15 principales usuarios de memoria residentes.

$ 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

También puede verificar la reserva de memoria compartida, pero solo sabrá quién es el propietario de los segmentos.

Asignación de 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

tenga en cuenta que las asignaciones reservadas son mucho más altas que las páginas asignadas reales (df 'usado')

Asignaciones del 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         

Editar : es necesario pasar --sort -rssa pspara obtener los procesos con el mayor uso de memoria, de lo contrario, la lista de procesos se ordena aumentando numéricamente y proporciona los procesos con el menor uso de memoria.

Emmanuel
fuente
5

Tengo una máquina más antigua que uso que escupe constantemente mensajes de pérdida de 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

Mi guión:

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

Lo nombró 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

Se puede ver que bajé a 374 MB, ejecuté sync; sudo echo 3 > /proc/sys/vm/drop_cachesy recuperé 417 MB. Se puede cronejecutar cada 5 minutos o simplemente tener un terminal abierto y ejecutarlo cuando vea un rendimiento lento. Sí, necesito agregar memoria a la máquina ...

Warpig
fuente
El formato parece ser un problema, no estoy seguro de cómo solucionarlo
Warpig
1
Use el enlace de edición debajo de su publicación. Hay una barra de herramientas de formato y un signo de interrogación naranja sobre el área de texto que enlaza con la ayuda de formato de Markdown .
David Foerster
Por favor, eche un vistazo a mi comentario reciente sobre la pregunta . Estoy convencido de que la idea de liberar memoria principal al vaciar y soltar cachés está equivocada y sé que no estoy solo con esa conclusión.
David Foerster
Muchas gracias, David ... Estoy totalmente de acuerdo en que el vaciado / caída de caché está mal orientado ... Pero algo se está bloqueando y haciendo que la máquina se congele / bloquee ... Simplemente desconcertado sobre lo que es, pensando que es un problema de Firefox. ..
Warpig
3

memstat también es una buena herramienta que mostrará la cantidad de memoria utilizada por cada bloque, así como la cantidad de memoria utilizada por las bibliotecas cargadas. No es la mejor herramienta, pero vale la pena usarla para recopilar detalles y estadísticas.

memstat -w -p pid Es un buen comando para usar.

Chef Faraón
fuente
1
el enlace está roto, creo que este es bueno
vladkras
1

Tuve un problema similar pero con una solución muy extraña.

Por alguna razón desconocida, tenía un servidor de correo en la configuración y el funcionamiento de mi computadora portátil. No sé por qué lo tenía ... Sin embargo, cerré su servicio y resultó que ese software en mi computadora portátil estaba bajo un ataque ddos. Después de eso, todo fue normal.

Mario Kamenjak
fuente