Kako otkriti curenje memorije u Ubuntuu



Isprobajte Naš Instrument Za Uklanjanje Problema

Postoji nekoliko razloga zbog kojih bi moglo doći do curenja memorije na Ubuntuu, ali na sreću, očito je kada se dogode. Buggy kôd često je najveći razlog jer programeri možda nisu imali priliku provjeriti hoće li se osloboditi memorija koja više nije potrebna. Ako ste instalirali nestabilne pakete ili sastavljali kôd iz izvora, možda se iz tog razloga bavite curenjem memorije. Vjerojatno ćete ih početi primjećivati ​​jer se softverski programski paketi počinju žaliti zbog nedostatka memorije kad imate instaliran više nego dovoljno fizičkog RAM-a.



Ako ste zabrinuti zbog curenja memorije, pokušajte opetovano upisivati ​​besplatno u terminal. Ako iznenada počnete primijetiti kako RAM brzo raste, tada ste već otkrili curenje memorije. Ako primite pogrešku koja glasi nešto poput bash: Nema dovoljno memorije dok to radite, a nemate ništa osim terminala ili čak samo virtualne konzole, tada gotovo neupitno imate posla s njom. Neka curenja memorije mogu biti malo suptilnija, ali Ubuntu i to različiti izdvojeni alati i paketi mogu vam pomoći da ih otkrijete.



Otkrivanje curenja memorije u Ubuntuu

Budući da se alati koji se koriste za otkrivanje curenja memorije prvenstveno temelje na CLI odzivu, nije važno na kojoj verziji Ubuntua ih pokrećete. Oni bi trebali dobro funkcionirati unutar Unity terminala u uobičajenom Ubuntuu, s virtualne konzole na Ubuntu Serveru, iz lxterm-a u Lubuntuu, Konsole-a u Kubuntu-u ili čak unutar Xfce-a u Xubuntu-u. Pokušajte izvesti jednostavan zadatak poput sudo -s i za početak unesite lozinku.



To bi vam trebalo donijeti korijensku ljusku ako se pravilno izvede, ali može uzrokovati pogrešku u memoriji ako radite s curenjem koje je već otišlo predaleko. Ako doista možete pristupiti korijenskoj ljusci, pokušajte utipkati echo 3> / proc / sys / m / drop_caches, pritisnite tipku enter i zatim utipkajte exit. Pokušajte ponovo pokrenuti free ili free -m da biste vidjeli je li to pomoglo oslobađanju memorije.

Neki programeri tvrde da nema smisla prisiljavati kernel da napusti predmemoriju, jer bi ih trebalo isprati i tako povratiti čim zatreba dodatna fizička memorija. Međutim, iako će prisilno ispiranje ovih predmemorija oštetiti performanse sustava, imajte na umu da je ovo samo test. Nakon što ponovno pokrenete sustav, Linux kernel trebao bi ponovno sastaviti memorijske predmemorije onako kako su prvotno bili.

Nekoliko je ljudi predložilo dodavanje linijske sinkronizacije; sudo echo 3> / proc / sys / vm / drop_caches na skriptu koju cron radi dosljedno, ali to prije svega poražava svrhu predmemoriranja memorije. Slobodna memorija sama je samo neiskorišteni RAM, a to znači da se podaci moraju učitavati iz mnogo sporijeg vremenaelektromehanički ili NAND uređaji za pohranu. Bez obzira na brzinu ovih uređaja, oni nisu brzi kao RAM, što znači da, iako biste trebali popraviti curenje memorije, zapravo ne biste trebali petljati u predmemoriju nakon što je postavite na optimalnu postavku.



Ako ste zaključili da uistinu stalno dolazi do curenja memorije, koje se povremeno događa tijekom upotrebe vašeg računala i ne može se posebno suziti, ali i dalje imate CLI pristup, pokušajte pokrenuti naredbu top. To bi vam trebalo dati popis pokrenutih procesa.

Ako vam Ubuntu pošalje neobičnu pogrešku o vrhu, umjesto toga pokušajte izdati busybox top kako biste pristupili još jednostavnijoj verziji ovog programa. Nakon što imate popis, pogledajte stupac% MEM ili sličan da biste vidjeli kojim aplikacijama je dodijeljeno najviše memorije. Iako ste mogli zabilježiti PID i izdati naredbu kill za točan broj PID-a, to će samo prisiliti aplikaciju da se zatvori. Memorija koju koriste možda se ipak neće osloboditi nakon što to učinite, iako je to vrijedno pokušaja.

Ako pronađete aplikaciju koja koristi veliku količinu memorije, pritisnite q da biste zatvorili, a zatim pokušajte ubiti #### s PID brojem s prethodnog zaslona. Sistemske procese ne biste trebali ubijati na ovaj način, niti bi trebalo raditi bilo što u čemu imate nespremljeno. Zamislite to slično kao ubijanje nečega pomoću popisa zadataka Ctrl + Alt + Del, koji također možete koristiti za isti postupak.

Kad pronađete program kojem se to neprestano događa, možete ga konfigurirati da spriječi ponašanje u budućnosti. Svaki će pojedinačni program, naravno, trebati drugačiji način na koji se nalazi izvan zadatka pukog otkrivanja curenja memorije.

Ako ne radite samo programe za rješavanje problema, već i zapravo radite s kodom, postoji nekoliko drugih resursa koje imate. Ubuntu i njegovi derivati ​​nude vam membarijere, memusage i memusagestat C rutine za programiranje.

Jednostavno upotrijebite man membarrier, man memusage ili man memusagestat da biste pogledali stranice Priručnika za Linux programera na ovim važnim rutinama. Ako postoje nadogradnje u budućim verzijama knjižnica kako budu izlazile nove verzije Ubuntua, tada će promjene biti ovdje uvijek navedene.

Ako vam je potreban grafički sadržaj, tada memusagestat nudi čak i mogućnost spremanja grafičkog prikaza upotrebe memorije u PNG datoteku. To ga čini privlačnim svojstvom i za autore uslužnih programa, jer se može koristiti za izradu aplikacija koje redovito provjeravaju curenje memorije.

Možda ćete poželjeti instalirati memprof, koji je alat za profiliranje upotrebe memorije kako bi vam pomogao u pronalaženju curenja memorije. Generira profil o tome koliko memorije dodjeljuje svaka funkcija u programu koji pišete. Također može skenirati postojeću memoriju kako bi pronašao dodijeljene blokove, ali više nema izvorne reference. To čini unaprijed učitavanjem knjižnice kako bi nadjačao značajke dodjeljivanja memorije standardne C biblioteke.

Ako planirate koristiti ovo, obavezno uklonite liniju include memprof s početka koda prije nego što ga pustite. To se koristi kako bi se osiguralo da nema curenja, ali ne bi trebalo postati ovisnost ako svoj paket pakirate i pustite u spremište.

4 minute čitanja