Com detectar una fuga de memòria a Ubuntu



Proveu El Nostre Instrument Per Eliminar Problemes

Hi ha diverses raons per les quals es pot produir una fuita de memòria a Ubuntu, però, per sort, és obvi quan es produeixen. El codi de buggy és sovint el motiu principal, ja que és possible que els programadors no hagin tingut l’oportunitat de comprovar que la memòria que ja no és necessària s’allibera. Si heu instal·lat paquets inestables o heu compilat codi des del codi font, és possible que tingueu problemes de memòria per aquest motiu. És probable que comenceu a notar-los perquè els paquets d’aplicacions de programari comencen a queixar-se de la manca de memòria quan teniu instal·lada una RAM física suficient.



Si us preocupa una fuita de memòria, proveu d'escriure gratuïtament en un terminal. Si de sobte comenceu a veure que l’ús de la RAM creix ràpidament, ja heu detectat una fuga de memòria. Si rebeu un error que digui alguna cosa com bash: no hi ha prou memòria mentre feu això i no teniu res més que un terminal o, fins i tot, només una consola virtual oberta, de manera gairebé no en teniu cap. Algunes fuites de memòria poden ser una mica més subtils, però Ubuntu i els seus derivats inclouen eines i paquets que us poden ajudar a detectar-los.



Detecció de pèrdues de memòria a Ubuntu

Com que les eines que s’utilitzen per detectar fuites de memòria es basen principalment al voltant de l’indicador CLI, no importa en quina versió d’Ubuntu les executeu. Aquests haurien de funcionar bé dins d’un terminal Unity a l’Ubuntu normal, des d’una consola virtual a l’Ubuntu Server, des d’un lxterm a Lubuntu, un Konsole a Kubuntu o fins i tot dins de Xfce a Xubuntu. Proveu de realitzar una tasca senzilla com sudo -s i escriviu la vostra contrasenya per començar.



Això us proporcionaria un intèrpret d’ordres d’arrel si es realitza correctament, però pot causar un error de memòria si esteu treballant amb una fuita que ja ha anat massa lluny. Si de fet podeu accedir a un intèrpret d’ordres arrel, proveu d’escriure echo 3> / proc / sys / m / drop_caches, premeu la tecla Enter i, a continuació, escriviu exit. Proveu de tornar a executar free o free -m per veure si us ha ajudat a alliberar memòria.

Alguns programadors argumenten que no té cap sentit forçar el nucli a deixar les memòries cau, ja que haurien de ser netejades i recuperades tan aviat com calgui una memòria física addicional. Tanmateix, si bé el rentat forçat d'aquestes memòries cau perjudicarà el rendiment del sistema, tingueu en compte que això només és una prova. Un cop hàgiu reiniciat el sistema, el nucli Linux hauria de tornar a muntar les memòries cau de memòria tal com eren en primer lloc.

Algunes persones han suggerit afegir la sincronització de línia; sudo echo 3> / proc / sys / vm / drop_caches a un script que cron s'executa constantment, però això derrota l'objectiu de la memòria cau de memòria en primer lloc. La memòria lliure en si mateixa no és més que RAM inutilitzada, i això vol dir que les dades s’han de carregar des de molt més lentamentelectromecànica o dispositius d’emmagatzematge NAND. Per molt ràpids que siguin aquests dispositius, no són tan ràpids com la memòria RAM, cosa que significa que, tot i que hauríeu de corregir les fuites de memòria, no hauríeu de manipular el sistema de memòria cau un cop el teniu configurat a la configuració òptima.



Si heu decidit que teniu una fuita de memòria consistent que es produeix periòdicament mentre utilitzeu la màquina i que no es pot reduir específicament, però teniu accés a la CLI, proveu d'executar l'ordre superior. Això us proporcionarà una llista dels processos en execució.

Si Ubuntu us produeixi un error inusual sobre top, proveu d'emetre busybox top per accedir a una versió encara més senzilla d'aquest programa. Un cop tingueu una llista, mireu la columna% MEM o similar per veure quines aplicacions tenen més memòria. Tot i que podeu notar el PID i emetre una ordre kill al número exacte del PID, això només obligarà a tancar l'aplicació. És possible que la memòria que utilitzen no es publiqui després de fer això, tot i que val la pena fer-ho.

Si trobeu una aplicació que utilitza una gran quantitat de memòria, premeu q per sortir i, a continuació, intenteu matar #### amb el número PID de la pantalla anterior. Els processos del sistema no s’han d’eliminar d’aquesta manera, ni res del que tingueu desat no hauria de funcionar. Penseu en això de manera similar a matar alguna cosa amb la llista de tasques Ctrl + Alt + Supr, que també podeu utilitzar per a aquest mateix procés.

Quan hàgiu trobat un programa al qual això succeeix constantment, el podeu configurar per evitar el comportament en el futur. Per descomptat, cada programa individual necessitarà un recurs diferent, que està més enllà de la tasca de detectar només fuites de memòria.

Si no només heu de resoldre problemes, sinó que també heu de treballar amb codi, hi ha alguns altres recursos que teniu. Ubuntu i els seus derivats us ofereixen les rutines membarrier, memusage i memusagestat C per a la programació.

Simplement utilitzeu man membarrier, man memusage o man memusagestat per veure les pàgines del Manual del programador de Linux sobre aquestes rutines importants. Si hi ha actualitzacions en futures versions de les biblioteques a mesura que surten noves versions d'Ubuntu, els canvis sempre es detallaran aquí.

Si necessiteu contingut gràfic, memusagestat ofereix fins i tot l’opció de desar una representació gràfica de l’ús de la memòria en un fitxer PNG. Això el converteix en una característica atractiva també per als autors de les utilitats, ja que es pot utilitzar per fer aplicacions que comproven periòdicament si hi ha fuites de memòria.

També és possible que vulgueu instal·lar memprof, que és una eina per perfilar l’ús de la memòria per ajudar-vos a trobar fuites de memòria. Genera un perfil sobre la quantitat de memòria que assigna cada funció d’un programa que escriviu. També pot escanejar memòria existent per trobar blocs assignats, però que ja no contenen referències genuïnes. Ho fa carregant prèviament una biblioteca per anul·lar les funcions d’assignació de memòria de la biblioteca C estàndard.

Si teniu previst utilitzar-lo, assegureu-vos d’eliminar la línia memprof inclosa del principi del codi abans de publicar-lo. S'utilitza per assegurar-vos que no tingueu filtracions, però no hauria de convertir-se en una dependència si empaqueteu el codi i el deixeu en un dipòsit.

4 minuts de lectura