Cómo detectar una fuga de memoria en Ubuntu



Pruebe Nuestro Instrumento Para Eliminar Los Problemas

Hay varias razones por las que puede ocurrir una pérdida de memoria en Ubuntu, pero afortunadamente, es obvio cuando ocurren. El código defectuoso es a menudo la razón principal, ya que los programadores podrían no haber tenido la oportunidad de verificar para asegurarse de que se libere la memoria que ya no se necesita. Si ha estado instalando paquetes inestables o compilando código desde la fuente, entonces podría estar lidiando con pérdidas de memoria por este motivo. Probablemente comenzará a notarlos porque los paquetes de aplicaciones de software comienzan a quejarse de que no tienen memoria cuando tiene más que suficiente RAM física instalada.



Si le preocupa una pérdida de memoria, intente escribir free repetidamente en una terminal. Si de repente comienza a ver que el uso de RAM crece rápidamente, entonces ya ha detectado una pérdida de memoria. Si recibe un error que dice algo como bash: No hay suficiente memoria mientras hace esto y no tiene nada más que una terminal o incluso una consola virtual abierta, entonces es casi incuestionable que está lidiando con una. Algunas fugas de memoria pueden ser un poco más sutiles, pero Ubuntu y sus diversas derivaciones cuentan con herramientas y paquetes que pueden ayudarlo a detectarlas.



Detectando pérdidas de memoria en Ubuntu

Dado que las herramientas utilizadas para detectar fugas de memoria se basan principalmente en el indicador CLI, no importa en qué versión de Ubuntu las ejecute. Estos deberían funcionar bien dentro de una terminal de Unity en Ubuntu normal, desde una consola virtual en Ubuntu Server, desde un lxterm en Lubuntu, una Konsole en Kubuntu o incluso dentro de Xfce en Xubuntu. Intente realizar una tarea simple como sudo -s y escriba su contraseña para comenzar.



Esto debería proporcionarle un shell raíz si se realiza correctamente, pero puede causar un error de memoria si está trabajando con una fuga que ya ha ido demasiado lejos. Si de hecho puede acceder a un shell de root, intente escribir echo 3> / proc / sys / m / drop_caches, presione la tecla enter y luego escriba exit. Intente ejecutar free o free -m nuevamente para ver si eso ayudó a liberar memoria.

Algunos programadores argumentan que no tiene sentido obligar al kernel a eliminar sus cachés, ya que deberían vaciarse y, por lo tanto, recuperarse tan pronto como se necesite memoria física adicional. Sin embargo, aunque forzar el vaciado de estos cachés dañará el rendimiento del sistema, tenga en cuenta que esto es simplemente una prueba. Una vez que haya reiniciado el sistema, el kernel de Linux debería volver a ensamblar los cachés de memoria de la forma en que estaban en primer lugar.

Algunas personas han sugerido agregar la sincronización de línea; sudo echo 3> / proc / sys / vm / drop_caches a un script que cron ejecuta de manera consistente, pero esto frustra el propósito del almacenamiento en memoria caché en primer lugar. La memoria libre en sí misma es simplemente RAM no utilizada, y eso significa que los datos deben cargarse desde mucho más lentoelectromecánico o dispositivos de almacenamiento NAND. No importa qué tan rápidos sean estos dispositivos, no son tan rápidos como la RAM, lo que significa que, si bien debe reparar las pérdidas de memoria, no debe alterar el sistema de caché una vez que lo haya configurado en la configuración óptima.



Si ha decidido que, de hecho, tiene una pérdida de memoria constante que ocurre periódicamente mientras usa su máquina y no puede reducirse específicamente, pero aún tiene acceso CLI, intente ejecutar el comando superior. Esto debería darle una lista de procesos en ejecución.

Si Ubuntu le da un error inusual sobre top, intente emitir busybox top en su lugar para acceder a una versión aún más simple de este programa. Una vez que tenga una lista, mire la columna% MEM o similar para ver qué aplicaciones tienen asignada la mayor cantidad de memoria. Si bien puede anotar el PID y emitir un comando de interrupción con el número exacto del PID, esto simplemente forzará el cierre de la aplicación. Es posible que la memoria que usan aún no se libere después de hacer esto, aunque, por supuesto, vale la pena intentarlo.

Si encuentra una aplicación que está usando una gran cantidad de memoria, presione q para salir y luego intente eliminar #### con el número PID de la pantalla anterior. Los procesos del sistema no deben matarse de esta manera, ni tampoco debe funcionar nada en lo que no haya guardado. Piense en esto de manera similar a matar algo con la lista de tareas Ctrl + Alt + Del, que también puede usar para este mismo proceso.

Cuando encuentre un programa al que le ocurre esto constantemente, puede configurarlo para evitar el comportamiento en el futuro. Cada programa individual, por supuesto, necesitará un recurso diferente, que está más allá de la tarea de simplemente detectar pérdidas de memoria.

En caso de que no se limite a solucionar problemas de aplicaciones, sino que también trabaje con código, existen algunos otros recursos que tiene. Ubuntu y sus derivados le ofrecen las rutinas de programación membarrier, memusage y memusagestat C.

Simplemente use man membarrier, man memusage o man memusagestat para ver las páginas del Manual del programador de Linux sobre estas importantes rutinas. Si hay actualizaciones en versiones futuras de las bibliotecas a medida que salgan nuevas versiones de Ubuntu, los cambios siempre se describirán aquí.

Si necesita contenido gráfico, memusagestat incluso ofrece la opción de guardar una representación gráfica del uso de la memoria en un archivo PNG. Esto también lo convierte en una característica atractiva para los autores de utilidades, ya que se puede utilizar para crear aplicaciones que comprueben regularmente las pérdidas de memoria.

Es posible que también desee instalar memprof, que es una herramienta para perfilar el uso de la memoria con el fin de ayudarlo a encontrar pérdidas de memoria. Genera un perfil con respecto a la cantidad de memoria que asigna cada función en un programa que está escribiendo. También puede escanear la memoria existente para encontrar bloques que hayan sido asignados, pero que ya no tengan referencias genuinas. Para ello, carga previamente una biblioteca para anular las funciones de asignación de memoria de la biblioteca C estándar.

Si planeas usar esto, asegúrate de eliminar la línea include memprof del principio de tu código antes de publicarlo. Esto se usa para asegurarse de que no haya fugas, pero no debería convertirse en una dependencia si empaqueta su código y lo libera en un repositorio.

4 minutos de lectura