Hur man upptäcker en minnesläcka i Ubuntu



Prova Vårt Instrument För Att Eliminera Problem

Det finns flera anledningar till att minnesläckage kan uppstå på Ubuntu, men som tur är är det uppenbart när de inträffar. Buggykod är ofta den största anledningen, eftersom programmerare kanske inte har haft möjlighet att kontrollera att minnet som inte längre behövs släpps. Om du har installerat instabila paket eller sammanställt kod från källan, kan det hända att du har att göra med minnesläckor. Du kommer antagligen att börja lägga märke till dem eftersom programvarupaket börjar klaga på att du har slut på minne när du har mer än tillräckligt med fysiskt RAM-minne installerat.



Om du är orolig för en minnesläcka kan du prova att skriva gratis upprepade gånger i en terminal. Om du plötsligt börjar se RAM-användning växer snabbt, har du redan upptäckt en minnesläcka. Om du får ett fel som läser något som bash: Inte tillräckligt med minne medan du gör detta och du har ingenting annat än en terminal eller till och med bara en virtuell konsol öppen, så har du nästan utan tvekan att göra med en. Vissa minnesläckor kan vara lite subtilare, men Ubuntu och det finns olika avknoppningar har verktyg och paket som kan hjälpa dig att upptäcka dessa.



Upptäcka minnesläckor i Ubuntu

Eftersom verktygen som används för att upptäcka minnesläckor huvudsakligen baseras kring CLI-prompten spelar det ingen roll vilken version av Ubuntu du kör dem på. Dessa ska fungera bra inuti en Unity-terminal i vanlig Ubuntu, från en virtuell konsol i Ubuntu Server, från en lxterm i Lubuntu, en Konsole i Kubuntu eller till och med inuti Xfce i Xubuntu. Försök att utföra en enkel uppgift som sudo -s och skriv ditt lösenord för att börja.



Detta bör ge dig ett rotskal om det utförs korrekt, men kan orsaka ett minnesfel om du arbetar med en läcka som redan har gått för långt. Om du verkligen kan komma åt ett root-skal, försök sedan skriva echo 3> / proc / sys / m / drop_caches, tryck på enter-tangenten och skriv sedan exit. Försök springa gratis eller gratis -m igen för att se om det har hjälpt till att frigöra minne.

Vissa programmerare hävdar att det inte är någon mening att tvinga kärnan att släppa sina cacheminnes, eftersom de bör spolas och därmed återvinnas så snart ytterligare fysiskt minne behövs. Men medan kraftspolning kommer dessa cachar att skada systemets prestanda, kom ihåg att detta bara är ett test. När du har startat om systemet ska Linux-kärnan åter montera minnescacherna som de var i första hand.

Några personer har föreslagit att radssynkroniseringen ska läggas till; sudo echo 3> / proc / sys / vm / drop_caches till ett skript som cron körs konsekvent, men detta förstör syftet med minnescachning i första hand. Det fria minnet i sig är bara oanvändt RAM, och det betyder att data måste laddas från mycket långsammareelektromekanisk eller NAND-lagringsenheter. Oavsett hur snabbt dessa enheter är, de är inte så snabba som RAM är, vilket innebär att även om du ska åtgärda minnesläckor, bör du inte faktiskt manipulera cachesystemet när du har ställt in den på optimal inställning.



Om du har bestämt att du verkligen har en konsekvent minnesläcka som sker regelbundet när du använder din maskin och den inte kan begränsas specifikt, men du har fortfarande CLI-åtkomst, försök sedan köra det översta kommandot. Detta bör ge dig en lista över pågående processer.

Skulle Ubuntu ge dig ett ovanligt fel om top, försök istället att utfärda upptagenbox-topp för att få tillgång till en ännu enklare version av detta program. När du har en lista, titta på% MEM eller liknande kolumn för att se vilka applikationer som tilldelas mest minne. Medan du kan notera PID och utfärda ett dödkommando till det exakta antalet PID, kommer detta bara att tvinga applikationen att stängas. Minnet de använder kanske fortfarande inte släpps när du gör det, men det är naturligtvis värt ett skott.

Om du hittar ett program som använder en stor mängd minne, tryck på q för att avsluta och försök sedan döda #### med PID-numret från föregående skärm. Systemprocesser bör inte dödas på detta sätt, och inte heller något som du inte har sparat ska fungera i. Tänk på detta på samma sätt som att döda något med Ctrl + Alt + Del-uppgiftslistan, som du också kan använda för samma process.

När du har hittat ett program som detta konsekvent händer med, kan du konfigurera det för att förhindra beteendet i framtiden. Varje enskilt program kommer naturligtvis att behöva ett annat tillvägagångssätt, vilket ligger utanför uppgiften att bara upptäcka minnesläckor.

Om du inte bara felsöker applikationer utan också arbetar med kod så finns det några andra resurser du har. Ubuntu och dess derivat erbjuder dig rutinerna för membarrier, memusage och memusagestat C för programmering.

Använd helt enkelt man membarrier, man memusage eller man memusagestat för att se Linux Programmer's Manual-sidor om dessa viktiga rutiner. Om det finns uppgraderingar i framtida versioner av biblioteken när nya versioner av Ubuntu kommer ut, kommer ändringarna alltid att beskrivas här.

Om du behöver grafiskt innehåll erbjuder memusagestat till och med möjligheten att spara en grafisk representation av minnesanvändningen i en PNG-fil. Detta gör det också till en attraktiv funktion för verktygsförfattare, eftersom den kan användas för att göra applikationer som regelbundet söker efter minnesläckor.

Du kanske också vill installera memprof, som är ett verktyg för profilering av minnesanvändning för att hjälpa dig att hitta minnesläckor. Den genererar en profil om hur mycket minne varje funktion i ett program du skriver tilldelar. Det kan också skanna befintligt minne för att hitta block som har tilldelats men inte längre innehåller äkta referenser. Det görs genom att förinställa ett bibliotek för att åsidosätta standard C-bibliotekets minnestilldelningsfunktioner.

Om du planerar att använda detta, se till att ta bort inkludera memprof-raden från början av din kod innan du släpper den. Detta används för att se till att du inte har några läckor, men det bör inte bli ett beroende om du paketerar din kod och släpper den i ett arkiv.

4 minuter läst