Deze vraag wordt hier zeer gedetailleerd behandeld.
Hoe meet je het geheugengebruik van een applicatie of proces in Linux?
Uit het blogartikel van Understanding memory usage on Linux blijkt dat ps
geen accurate tool is om voor deze bedoeling te gebruiken.
Waarom
ps
is "wrong"Afhankelijk van hoe je het bekijkt, rapporteert
ps
niet het echte geheugengebruik van processen. Wat het echt doet is laten zien hoeveel geheugen een proces in beslag zou nemen als het het enige draaiende proces zou zijn. Natuurlijk heeft een typische Linux machine enkele tientallen processen draaien op een gegeven moment, wat betekent dat de VSZ en RSS getallen gerapporteerd doorps
bijna zeker verkeerd zijn.
Met ps
of soortgelijke programma's krijg je alleen de hoeveelheid geheugenpagina's die door dat proces zijn toegewezen. Dit aantal is correct, maar:
geeft niet de werkelijke hoeveelheid geheugen weer die door de applicatie wordt gebruikt, alleen de hoeveelheid geheugen die ervoor is gereserveerd
kan misleidend zijn als pagina's worden gedeeld, bijvoorbeeld door meerdere threads of door het gebruik van dynamisch gelinkte bibliotheken
Als u echt wilt weten hoeveel geheugen uw applicatie werkelijk gebruikt, moet u deze uitvoeren met een profiler. Bijvoorbeeld valgrind
kan je inzicht geven in de hoeveelheid gebruikt geheugen, en, nog belangrijker, over mogelijke geheugenlekken in je programma. De heap profiler tool van valgrind heet 'massif':
Massif is een heap profiler. Het voert gedetailleerde heap profiling uit door regelmatig snapshots te nemen van de heap van een programma's. Het produceert een grafiek die heapgebruik in de tijd toont, inclusief informatie over welke delen van het programma verantwoordelijk zijn voor de meeste geheugentoewijzingen. De grafiek wordt aangevuld met een tekst- of HTML-bestand dat meer informatie bevat om te bepalen waar het meeste geheugen wordt toegewezen. Massif draait programma's ongeveer 20x langzamer dan normaal.
Zoals uitgelegd in de valgrind documentatie, moet je het programma door valgrind laten lopen:
valgrind --tool=massif <executable> <arguments>
Massif schrijft een dump van geheugengebruik snapshots (b.v. massif.out.12345
). Deze geven, (1) een tijdlijn van geheugengebruik, (2) voor elke momentopname, een record van waar in uw programma geheugen werd gealloceerd.
Een geweldig grafisch hulpmiddel voor het analyseren van deze bestanden is massif-visualizer. Maar ik vond ms_print
, een eenvoudig tekst-gebaseerd hulpmiddel dat met valgrind wordt meegeleverd, al een grote hulp.
Om geheugenlekken te vinden, gebruik je het (standaard) memcheck
gereedschap van valgrind.
Moeilijk te zeggen, maar hier zijn twee dingen die kunnen helpen.
$ ps aux
zal je Virtuele Grootte (VSZ) geven
Je kunt ook gedetailleerde statistieken van het /proc bestandssysteem krijgen door naar /proc/$pid/status
te gaan
Het belangrijkste is de VmSize, die in de buurt zou moeten liggen van wat ps aux
geeft.
/proc/19420$ cat status Naam: firefox Status: S (slapend) Tgid: 19420 Pid: 19420 PPid: 1 TracerPid: 0 Uid: 1000 1000 1000 1000 Gid: 1000 1000 1000 1000 FDS grootte: 256 Groepen: 4 6 20 24 25 29 30 44 46 107 109 115 124 1000 VmPeak: 222956 kB VmSize: 212520 kB VmLck: 0 kB VmHWM: 127912 kB VmRSS: 118768 kB VmData: 170180 kB VmStk: 228 kB VmExe: 28 kB VmLib: 35424 kB VmPTE: 184 kB Draden: 8 SigQ: 0/16382 SigPnd: 000000000000 ShdPnd: 00000000000000 SigBlk: 00000000000000 SigIgn: 0000000020001000 SigCgt: 000000018000442f CapInh: 000000000000 CapPrm: 000000000000 CapEff: 000000000000 Cpus_toegestaan: 03 Mems_toegestaan: 1 vrijwillige_ctxt_switches: 63422 niet-vrijwillige_ctxt_switches: 7171
Neem valgrind. Geef het je programma om te draaien, en het'zal je veel vertellen over zijn geheugengebruik.
Dit zou alleen gelden voor het geval van een programma dat enige tijd draait en dan stopt. Ik weet niet of valgrind de hand kan leggen op een reeds lopend proces of moet't-stoppen processen zoals daemons.