Hoe een geheugenlek in Ubuntu te detecteren



Probeer Ons Instrument Voor Het Oplossen Van Problemen

Er zijn verschillende redenen waarom een ​​geheugenlek kan optreden op Ubuntu, maar gelukkig is het duidelijk wanneer ze zich voordoen. Foutcode is vaak de grootste reden, omdat programmeurs misschien niet de gelegenheid hebben gehad om te controleren of geheugen dat niet langer nodig is, wordt vrijgegeven. Als je onstabiele pakketten hebt geïnstalleerd of code hebt gecompileerd vanuit de broncode, heb je om deze reden mogelijk te maken met geheugenlekken. U zult ze waarschijnlijk gaan opmerken omdat softwaretoepassingspakketten beginnen te klagen over onvoldoende geheugen als u meer dan voldoende fysiek RAM-geheugen hebt geïnstalleerd.



Als je je zorgen maakt over een geheugenlek, probeer dan herhaaldelijk free in een terminal te typen. Als je plotseling begint te zien dat het RAM-gebruik snel toeneemt, heb je al een geheugenlek gedetecteerd. Mocht je een foutmelding krijgen die zoiets als bash: niet genoeg geheugen leest terwijl je dit doet en je hebt niets anders dan een terminal of zelfs maar een virtuele console open, dan heb je er bijna ongetwijfeld mee te maken. Sommige geheugenlekken kunnen een beetje subtieler zijn, maar Ubuntu en zijn verschillende spin-offs bevatten tools en pakketten die u kunnen helpen deze te detecteren.



Geheugenlekken detecteren in Ubuntu

Omdat de tools die worden gebruikt voor het detecteren van geheugenlekken voornamelijk gebaseerd zijn op de CLI-prompt, maakt het niet uit op welke versie van Ubuntu u ze uitvoert. Deze zouden prima moeten werken in een Unity-terminal in gewone Ubuntu, vanaf een virtuele console in Ubuntu Server, vanaf een lxterm in Lubuntu, een Konsole in Kubuntu of zelfs in Xfce in Xubuntu. Probeer een eenvoudige taak uit te voeren, zoals sudo -s, en typ uw wachtwoord om te beginnen.



Dit zou je een rootshell moeten opleveren als deze correct wordt uitgevoerd, maar kan een geheugenfout veroorzaken als je werkt met een lek dat al te ver is gegaan. Als je inderdaad toegang hebt tot een rootshell, typ dan echo 3> / proc / sys / m / drop_caches, druk op de enter-toets en typ vervolgens exit. Probeer opnieuw gratis of gratis -m uit te voeren om te zien of dat heeft geholpen om geheugen vrij te maken.

Sommige programmeurs beweren dat het geen zin heeft om de kernel te dwingen zijn caches te laten vallen, aangezien ze moeten worden doorgespoeld en dus opnieuw moeten worden opgeëist zodra er extra fysiek geheugen nodig is. Hoewel het geforceerd doorspoelen van deze caches de systeemprestaties zal schaden, moet u er rekening mee houden dat dit slechts een test is. Nadat je het systeem opnieuw hebt opgestart, zou de Linux Kernel de geheugencaches opnieuw moeten samenstellen zoals ze in de eerste plaats waren.

Een paar mensen hebben voorgesteld om de lijnsynchronisatie toe te voegen; sudo echo 3> / proc / sys / vm / drop_caches naar een script dat cron consistent uitvoert, maar dit verslaat in de eerste plaats het doel van geheugencaching. Vrij geheugen zelf is slechts ongebruikt RAM, en dat betekent dat gegevens veel langzamer moeten worden geladenelektromechanisch of NAND-opslagapparaten. Hoe snel deze apparaten ook zijn, ze zijn niet zo snel als RAM is, wat betekent dat je, hoewel je geheugenlekken moet verhelpen, niet echt met het cachesysteem moet knoeien als je het eenmaal hebt ingesteld op de optimale instelling.



Als je hebt besloten dat je inderdaad een consistent geheugenlek hebt dat regelmatig optreedt tijdens het gebruik van je computer en het kan niet specifiek worden beperkt, maar je hebt nog steeds CLI-toegang, probeer dan de bovenste opdracht uit te voeren. Dit zou u een lijst met actieve processen moeten geven.

Mocht Ubuntu u een ongebruikelijke fout over top geven, probeer dan in plaats daarvan busybox top te geven om toegang te krijgen tot een nog eenvoudigere versie van dit programma. Als je eenmaal een lijst hebt, kijk dan in de% MEM of vergelijkbare kolom om te zien aan welke applicaties het meeste geheugen is toegewezen. Hoewel u de PID zou kunnen noteren en een kill-commando zou kunnen geven voor het exacte nummer van de PID, zal dit de toepassing alleen dwingen om te sluiten. Het geheugen dat ze gebruiken, wordt mogelijk nog steeds niet vrijgegeven nadat je dit hebt gedaan, hoewel het natuurlijk het proberen waard is.

Als u een toepassing vindt die veel geheugen gebruikt, drukt u op q om af te sluiten en probeert u #### te doden met het PID-nummer van het vorige scherm. Systeemprocessen zouden op deze manier niet moeten worden gedood, noch zou iets dat je niet hebt opgeslagen moeten werken. Zie dit op dezelfde manier als iets doden met de Ctrl + Alt + Del-takenlijst, die je ook voor hetzelfde proces kunt gebruiken.

Als u een programma heeft gevonden waarmee dit regelmatig gebeurt, kunt u dit configureren om gedrag in de toekomst te voorkomen. Elk afzonderlijk programma heeft natuurlijk een ander verhaal nodig, dat verder gaat dan alleen het detecteren van geheugenlekken.

Mocht u niet alleen problemen oplossen met applicaties, maar ook daadwerkelijk met code werken, dan zijn er een paar andere mogelijkheden. Ubuntu en zijn derivaten bieden u de membarrier-, memusage- en memusagestat C-routines voor programmeren.

Gebruik gewoon man membarrier, man memusage of man memusagestat om de Linux Programmer's Manual-pagina's over deze belangrijke routines te bekijken. Als er upgrades zijn in toekomstige versies van de bibliotheken wanneer er nieuwe versies van Ubuntu uitkomen, worden de wijzigingen hier altijd beschreven.

Als u grafische inhoud nodig heeft, biedt memusagestat zelfs de mogelijkheid om een ​​grafische weergave van het geheugengebruik op te slaan in een PNG-bestand. Dit maakt het ook een aantrekkelijke functie voor auteurs van hulpprogramma's, omdat het kan worden gebruikt om applicaties te maken die regelmatig controleren op geheugenlekken.

Mogelijk wilt u ook memprof installeren, een hulpmiddel voor het profileren van geheugengebruik om u te helpen bij het opsporen van geheugenlekken. Het genereert een profiel over hoeveel geheugen elke functie in een programma dat u schrijft, toewijst. Het kan ook het bestaande geheugen scannen om blokken te vinden die zijn toegewezen, maar niet langer echte referenties bevatten. Het doet dit door een bibliotheek vooraf te laden om de geheugentoewijzingsfuncties van de standaard C-bibliotheek te overschrijven.

Als u van plan bent dit te gebruiken, zorg er dan voor dat u de regel include memprof aan het begin van uw code verwijdert voordat u deze vrijgeeft. Dit wordt gebruikt om ervoor te zorgen dat je geen lekken hebt, maar het zou geen afhankelijkheid moeten worden als je je code verpakt en vrijgeeft in een repository.

4 minuten gelezen