2008-09-27 12 views
23

Tengo un sistema (Ubuntu) con muchos procesos y uno (o más) tiene una pérdida de memoria. ¿Hay una buena manera de encontrar el proceso que tiene la fuga? Algunos de los procesos son JVM, otros no. Algunos son de cosecha propia, algunos son de código abierto.cómo encuentro qué proceso está perdiendo memoria

Respuesta

3

Tarea difícil. Normalmente sugeriría tomar un depurador/perfilador de memoria como Valgrind y ejecutar los programas uno a uno en él. Pronto o más tarde encontrará el programa que se filtra y puede decirle al devloper o arreglarlo usted mismo.

+0

try [valgrind] (http://valgrind.org/) – nickleefly

13

Puede ejecutar el comando top (para ejecutar de forma no interactiva, escriba top -b -n 1). Para ver las aplicaciones que están perdiendo memoria, mirada en las siguientes columnas:

  • RPRVT - residente tamaño del espacio de direcciones privadas
  • RSHRD - dirección compartida del tamaño del espacio residente
  • RSIZE - tamaño de la memoria residente
  • VPRVT - dirección privada del tamaño del espacio
  • VSIZE - tamaño de memoria total
+1

Lo estaba intentando pero cualquier argumento de línea de comando que pase a la cima no da un resultado que tenga esta información. Me sale algo así como 'PID USER PR NI VIRT RES SHR S% CPU% MEM TIME + COMMAND '. ¿Alguna sugerencia de cómo obtener el resultado requerido? – niko

3

Como suggeseted, el camino a seguir es valgrind. Es un generador de perfiles que verifica muchos aspectos del rendimiento de ejecución de su aplicación, incluido el uso de la memoria.

El funcionamiento de su aplicación a través de Valgrind le permitirá verificar si se olvida de quitar memoria asignada con malloc, si liberar la misma memoria dos veces etc.

+3

No estaba preguntando cómo rastrear las pérdidas de memoria de cierto programa. Pero cómo identificar, cuáles de los procesos fueron los filtrados. – akauppi

5

Además de arriba, puede utilizar Monitor de sistema (System - Administración - Monitor del sistema, luego seleccione la pestaña Procesos). Seleccione Ver - Todos los procesos, vaya a Editar - Preferencias y habilite la columna Memoria virtual. Ordene por esta columna o por la columna de memoria

+1

¡GNOME definitivamente tiene este! – thanikkal

10

si el programa tiene una fuga durante un tiempo prolongado, la parte superior puede no ser práctica. Escribiría un script de shell simple que agrega el resultado de "ps aux" a un archivo cada X segundos, dependiendo de cuánto se tarda en filtrar cantidades significativas de memoria. Algo así como:

while true 
do 
echo "---------------------------------" >> /tmp/mem_usage 
date >> /tmp/mem_usage 
ps aux >> /tmp/mem_usage 
sleep 60 
done 
3

Si no puede hacerlo por deducción, tenga en cuenta la señal de bengala patrón de depuración: Aumentar la cantidad de memoria asignada por un proceso en un factor de diez. Luego ejecuta tu programa.

Si la cantidad de memoria que se filtró es la misma, ese proceso no fue la fuente de la fuga; restaurar el proceso y hacer la misma modificación en el siguiente proceso.

Cuando llegue al proceso responsable, verá el tamaño de su salto de fuga de memoria (el "destello de señal"). Puede restringirlo aún más al aumentar selectivamente el tamaño de asignación de declaraciones separadas dentro de este proceso.

2

Sugiero el uso de htop, como una mejor alternativa a la parte superior.

Cuestiones relacionadas