Cum să detectați o scurgere de memorie în Ubuntu



Încercați Instrumentul Nostru Pentru Eliminarea Problemelor

Există mai multe motive pentru care ar putea apărea o scurgere de memorie pe Ubuntu, dar, din fericire, este evident când apar. Codul buggy este adesea cel mai mare motiv, deoarece este posibil ca programatorii să nu fi avut ocazia să verifice dacă memoria care nu mai este necesară este eliberată. Dacă ați instalat pachete instabile sau ați compilat codul de la sursă, atunci este posibil să vă confruntați cu scurgeri de memorie din acest motiv. Probabil veți începe să le observați, deoarece pachetele de aplicații software încep să se plângă de lipsa de memorie atunci când aveți instalat mai mult decât suficient RAM fizic.



Dacă sunteți îngrijorat de o scurgere de memorie, încercați să tastați gratuit în mod repetat într-un terminal. Dacă începeți brusc să vedeți utilizarea RAM în creștere rapidă, atunci ați detectat deja o scurgere de memorie. Dacă primiți o eroare care arată ceva de genul bash: Nu aveți suficientă memorie în timp ce faceți acest lucru și nu aveți decât un terminal sau chiar o consolă virtuală deschisă, atunci aveți de-a face aproape fără îndoială cu unul. Unele scurgeri de memorie pot fi puțin mai subtile, dar Ubuntu și diversele sale produse derivate prezintă instrumente și pachete care vă pot ajuta să le detectați.



Detectarea scurgerilor de memorie în Ubuntu

Deoarece instrumentele utilizate pentru detectarea scurgerilor de memorie se bazează în principal pe promptul CLI, nu contează pe ce versiune de Ubuntu le folosiți. Acestea ar trebui să funcționeze bine în interiorul unui terminal Unity în Ubuntu obișnuit, dintr-o consolă virtuală în Ubuntu Server, dintr-un lxterm în Lubuntu, un Konsole în Kubuntu sau chiar în interiorul Xfce în Xubuntu. Încercați să efectuați o sarcină simplă, cum ar fi sudo -s și introduceți parola pentru a începe.



Acest lucru ar trebui să vă ofere un shell rădăcină dacă este efectuat corect, dar poate provoca o eroare de memorie dacă lucrați cu o scurgere care a mers deja prea departe. Dacă într-adevăr puteți accesa un shell rădăcină, încercați să tastați echo 3> / proc / sys / m / drop_caches, apăsați tasta Enter și apoi tastați exit. Încercați să rulați liber sau gratuit -m pentru a vedea dacă acest lucru a ajutat la eliberarea memoriei.

Unii programatori susțin că nu are rost să forțeze nucleul să renunțe la cache-urile sale, deoarece acestea ar trebui spălate și astfel recuperate de îndată ce este nevoie de memorie fizică suplimentară. Cu toate acestea, în timp ce spălarea cu forță a acestor cache va afecta performanța sistemului, rețineți că acesta este doar un test. După ce ați repornit sistemul, Kernel-ul Linux ar trebui să asambleze din nou memoria cache așa cum au fost ele în primul rând.

Câțiva oameni au sugerat adăugarea sincronizării liniei; sudo echo 3> / proc / sys / vm / drop_caches într-un script care cron rulează constant, dar acest lucru învinge scopul memorării în cache a memoriei. Memoria liberă în sine este doar o memorie RAM neutilizată și asta înseamnă că datele trebuie încărcate cu mult mai lentelectromecanică sau dispozitive de stocare NAND. Indiferent cât de rapide sunt aceste dispozitive, acestea nu sunt la fel de rapide ca RAM, ceea ce înseamnă că, deși ar trebui să remediați scurgerile de memorie, nu ar trebui să modificați sistemul cache după ce îl setați la setarea optimă.



Dacă ați decis că într-adevăr aveți o scurgere de memorie consistentă care se întâmplă periodic în timp ce utilizați mașina și nu poate fi restrânsă în mod specific, dar aveți în continuare acces la CLI, atunci încercați să rulați comanda de sus. Aceasta ar trebui să vă ofere o listă a proceselor care rulează.

În cazul în care Ubuntu îți va da o eroare neobișnuită despre top, atunci încearcă să emiți ocupat top pentru a accesa o versiune și mai simplă a acestui program. Odată ce ai o listă, uită-te la coloana% MEM sau coloană similară pentru a vedea aplicațiilor cărora li se alocă cea mai mare memorie. Deși puteți nota PID și emite o comandă kill la numărul exact al PID, acest lucru va forța doar închiderea aplicației. Este posibil ca memoria pe care o folosesc să nu fie eliberată după ce faceți acest lucru, deși merită, desigur, o lovitură.

Dacă găsiți o aplicație care folosește o cantitate mare de memorie, apăsați q pentru a ieși și apoi încercați să ucideți #### cu numărul PID de pe ecranul anterior. Procesele de sistem nu ar trebui să fie omorâte în acest fel și nici ceva din care nu ați salvat să funcționeze. Gândiți-vă la acest lucru în mod similar cu a ucide ceva cu lista de sarcini Ctrl + Alt + Del, pe care o puteți utiliza și pentru același proces.

Când ați găsit un program căruia i se întâmplă în mod constant, îl puteți configura pentru a preveni comportamentul în viitor. Fiecare program individual, desigur, va avea nevoie de un recurs diferit, care depășește sarcina de a detecta doar scurgerile de memorie.

Dacă nu aplicați doar soluționarea problemelor, ci și lucrați efectiv cu codul, există câteva alte resurse pe care le aveți. Ubuntu și derivatele sale vă oferă rutine membarrier, memusage și memusagestat C pentru programare.

Utilizați pur și simplu man membarrier, man memusage sau man memusagestat pentru a vizualiza paginile Manualului programatorului Linux pe aceste rutine importante. Dacă există actualizări în versiunile viitoare ale bibliotecilor pe măsură ce apar noi versiuni de Ubuntu, atunci modificările vor fi întotdeauna prezentate aici.

Dacă aveți nevoie de conținut grafic, atunci memusagestat oferă chiar și opțiunea de a salva o reprezentare grafică a utilizării memoriei într-un fișier PNG. Acest lucru îl face o caracteristică atractivă și pentru autorii de utilități, deoarece poate fi folosit pentru a crea aplicații care verifică în mod regulat scurgerile de memorie.

Ați putea dori, de asemenea, să instalați memprof, care este un instrument de profilare a utilizării memoriei, pentru a vă ajuta să găsiți scurgeri de memorie. Acesta generează un profil cu privire la câtă memorie alocă fiecare funcție dintr-un program pe care îl scrieți. De asemenea, poate scana memoria existentă pentru a găsi blocuri care au fost alocate, dar nu mai prezintă referințe autentice. Face acest lucru preîncărcând o bibliotecă pentru a suprascrie caracteristicile standard de alocare a memoriei bibliotecii C.

Dacă intenționați să utilizați acest lucru, asigurați-vă că eliminați linia include memprof de la începutul codului înainte de a-l elibera. Aceasta este utilizată pentru a vă asigura că nu aveți scurgeri, dar nu ar trebui să devină o dependență dacă împachetați codul și îl eliberați într-un depozit.

4 minute citite