Tätä kysymystä on käsitelty täällä hyvin yksityiskohtaisesti.
Miten voit mitata sovelluksen tai prosessin muistinkäyttöä Linuxissa?
Blogiartikkelin Understanding memory usage on Linux mukaan ps
ei ole tarkka työkalu tähän tarkoitukseen.
Miksi
ps
on "väärä" **Riippuen siitä, miten asiaa tarkastellaan,
ps
ei ilmoita prosessien todellista muistinkäyttöä. Se näyttää, kuinka paljon todellista muistia kukin prosessi veisi, jos se olisi ainoa käynnissä oleva prosessi. Tyypillisessä Linux-koneessa on tietysti useita kymmeniä prosesseja käynnissä milloin tahansa, mikä tarkoittaa, ettäps
:n ilmoittamat VSZ- ja RSS-lukemat ovat lähes varmasti vääriä.
ps
:llä tai vastaavilla työkaluilla saat vain kyseisen prosessin varaamien muistisivujen määrän. Tämä luku on oikea, mutta:
ei kerro sovelluksen käyttämän muistin todellista määrää, vaan ainoastaan sille varatun muistin määrän.
voi olla harhaanjohtava, jos sivuja jaetaan esimerkiksi useiden säikeiden kesken tai käyttämällä dynaamisesti linkitettyjä kirjastoja.
Jos todella haluat tietää, kuinka paljon muistia sovelluksesi todella käyttää, sinun on ajettava se profiloijan avulla. Esimerkiksi valgrind
voi antaa sinulle tietoa käytetystä muistin määrästä ja, mikä vielä tärkeämpää, mahdollisista muistivuodoista ohjelmassasi. Valgrindin heap-profilointityökalun nimi on 'massif':
Massif on heap profiler. Se suorittaa yksityiskohtaisen kasaprofiloinnin ottamalla säännöllisiä tilannekuvia ohjelman'kasasta. Se tuottaa graafin, joka näyttää kasan käytön ajan mittaan, mukaan lukien tiedot siitä, mitkä ohjelman osat ovat vastuussa suurimmista muistin varauksista. Kuvaajaa täydennetään teksti- tai HTML-tiedostolla, joka sisältää lisätietoja sen määrittämiseksi, missä muistia varataan eniten. Massif ajaa ohjelmat noin 20 kertaa normaalia hitaammin.
Kuten valgrind-dokumentaatiossa selitetään, sinun on ajettava ohjelma valgrindin kautta:
valgrind --tool=massif <executable> <arguments>
Massif kirjoittaa muistinkäytön tilannekuvan (esim. massif.out.12345
). Nämä tarjoavat (1) muistinkäytön aikajanan, (2) jokaisen tilannekuvan osalta tietueen siitä, missä kohtaa ohjelmaa muistia varattiin.
Erinomainen graafinen työkalu näiden tiedostojen analysointiin on massif-visualizer. Olen kuitenkin havainnut ms_print
, yksinkertaisen tekstipohjaisen työkalun, joka toimitetaan valgrindin mukana, olevan suureksi avuksi jo nyt.
Muistivuotojen löytämiseksi käytä valgrindin (oletus)työkalua memcheck
.
Vaikea sanoa varmasti, mutta tässä on kaksi "lähellä" asiaa, jotka voivat auttaa.
$ ps aux
antaa sinulle Virtual Size (VSZ)
Voit myös saada yksityiskohtaisia tilastoja /proc-tiedostojärjestelmästä menemällä osoitteeseen /proc/$pid/status
.
Tärkein on VmSize, jonka pitäisi olla lähellä sitä, mitä ps aux
antaa.
/proc/19420$ cat status Nimi: firefox Tila: S (nukkuu) Tgid: 19420 Pid: 19420 PPid: 1 TracerPid: 0 Uid: 1000 1000 1000 1000 1000 1000 Gid: 1000 1000 1000 1000 1000 1000 FDS-koko: 256 Ryhmät: 4 6 20 24 25 25 29 30 44 46 107 109 115 124 1000 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 Säikeet: 8 SigQ: 0/16382 SigPnd: 00000000000000000000 ShdPnd: 00000000000000000000 SigBlk: 0000000000000000 SigIgn: 0000000020001000 SigCgt: 000000018000442f CapInh: 0000000000000000 CapPrm: 0000000000000000 CapEff: 0000000000000000 Cpus_allowed: 03 Mems_allowed: 1 vapaaehtoiset_ctxt_switches: 63422 ei-vapaaehtoiset_ctxt_kytkennät: 7171
Hanki valgrind. anna sille ohjelmasi suoritettavaksi, ja se kertoo sinulle paljon sen muistinkäytöstä.
Tämä pätee vain siinä tapauksessa, että ohjelma toimii jonkin aikaa ja pysähtyy sitten. En'tiedä, voiko valgrind päästä käsiksi jo käynnissä olevaan prosessiin tai pitäis'ä pysäyttää prosesseja kuten daemoneja.