Optimér Linux/macOS-minne: Lær om virtuelt minne & vmstat

Både Linux og macOS benytter seg av virtuelt minne. Dette påvirker hvordan systemet ditt bruker fysisk minne (RAM), prosessoren (CPU), og harddisken.

Hva er virtuelt minne?

Din datamaskin har en begrenset mengde fysisk minne, kjent som RAM. Dette minnet styres av operativsystemet og deles mellom operativsystemet og applikasjonene. Hva skjer når den samlede mengden minne som kreves overstiger den fysiske RAM-kapasiteten?

Både Linux og macOS (som er bygget på Unix) kan bruke lagringsplass på harddisken som en utvidelse av RAM. Et reservert område på harddisken, kalt «swap-plass», fungerer som virtuelt minne.

Kjernen i operativsystemet kan flytte innhold fra RAM til swap-plassen for å frigjøre plass i RAM til andre prosesser. Data som er flyttet til swap kan hentes tilbake til RAM når det er nødvendig.

Tilgang til data i swap-området er tregere enn tilgang til RAM. Bruk av virtuelt minne øker også belastningen på andre deler av datamaskinen. Harddisken må utføre flere lese- og skriveoperasjoner, og CPU-en må arbeide mer for å flytte data mellom RAM og swap.

Linux gir deg verktøyet `vmstat` for å overvåke denne aktiviteten. Det gir rapporter om virtuell minnestatistikk.

`vmstat`-kommandoen

Ved å skrive `vmstat` uten ekstra parametere, får du en oversikt over gjennomsnittlige verdier siden maskinen sist ble startet. Dette er ikke en sanntidsvisning.

vmstat

Resultatet er en tabell med ulike kolonner:

Kolonnene er organisert i seksjoner: Procs, Memory, Swap, IO, System og CPU.

Her er en detaljert forklaring av hver kolonne:

Proc:

  • r: Antall prosesser som er klare for å kjøre, eller som venter på CPU-tid.
  • b: Antall prosesser i uavbrutt hvile. Disse venter på at en ressurs skal bli ledig og kan ikke avbrytes.

Memory:

  • swpd: Mengde virtuelt minne i bruk.
  • free: Mengde ubrukt minne.
  • buff: Mengde minne brukt som buffere.
  • cache: Mengde minne brukt som cache.

Swap:

  • si: Mengde virtuelt minne flyttet *inn* fra swap-området.
  • so: Mengde virtuelt minne flyttet *ut* til swap-området.

IO:

  • bi: Antall datablokker mottatt fra en blokkeringsenhet (lesing fra disk).
  • bo: Antall datablokker sendt til en blokkeringsenhet (skriving til disk).

System:

  • in: Antall avbrudd per sekund.
  • cs: Antall kontekstbytter per sekund.

CPU:

  • us: Prosentandel av CPU-tid brukt på ikke-kjerne kode (brukertid).
  • sy: Prosentandel av CPU-tid brukt på kjerne kode.
  • id: Prosentandel av CPU-tid brukt i inaktiv tilstand.
  • wa: Prosentandel av CPU-tid brukt på å vente på I/O-operasjoner.
  • st: Prosentandel av CPU-tid «stjålet» av hypervisor i virtualiserte miljøer.

Oppdateringer med tidsintervall

Du kan få `vmstat` til å oppdatere verdiene regelmessig ved å spesifisere et tidsintervall i sekunder. Følgende kommando vil oppdatere statistikken hvert 5. sekund:

vmstat 5

Dette vil legge til en ny linje med data hvert 5. sekund. Trykk Ctrl+C for å stoppe.

Begrense antall oppdateringer

For å begrense belastningen ved hyppige oppdateringer, spesielt ved feilsøking, kan du bruke en tellerverdi. Denne forteller `vmstat` hvor mange ganger den skal oppdatere før den avslutter. Uten tellerverdi, kjører `vmstat` til den avbrytes med Ctrl+C.

For å få `vmstat` til å oppdatere hvert 5. sekund, og kun 4 ganger, bruker du:

vmstat 5 4

Etter fire oppdateringer, stopper `vmstat` automatisk.

Endre måleenheter

Du kan velge å vise minne- og byttestatistikken i kilobyte eller megabyte med `-S` (enhetsvelger). Du må deretter spesifisere en av `k`, `K`, `m`, eller `M` som representerer:

  • k: 1000 bytes
  • K: 1024 bytes
  • m: 1000000 bytes
  • M: 1048576 bytes

Følgende kommando viser statistikk hvert 10. sekund, med minne- og byttestatistikken i megabyte:

vmstat 10 -S M

`-S` påvirker ikke IO-blokkstatistikken, som alltid vises i blokker.

Aktivt og inaktivt minne

Med `-a`-alternativet (aktiv) erstattes `buff`- og `cache`-kolonnene med `inact` og `active`. Disse viser mengden inaktivt og aktivt minne.

Følgende kommando viser disse kolonnene i stedet for `buff` og `cache`, og bruker megabyte som enhet:

vmstat 5 -a -S M

`-S`-alternativet påvirker også disse kolonnene.

Forking

`-f`-bryteren viser antall «forks» som har skjedd siden datamaskinen ble startet. Dette er antall ganger en prosess har blitt opprettet. Hver gang et nytt program eller en ny prosess startes, øker dette tallet.

vmstat -f

Denne verdien oppdateres ikke.

Slab-informasjon

Kjernen håndterer sin egen minneadministrasjon. For å gjøre minnetildeling og frigjøring effektivt, bruker den et system som kalles «slabs». Dette er en form for cache.

Minne tildelt for en bestemt type kjerne-dataobjekt kan gjenbrukes for et annet dataobjekt av samme type uten at minnet deallokeres og omallokeres. Tenk på dette som forhåndstildelte segmenter av RAM for kjernen.

For å se statistikk for slabs, bruk `-m`-alternativet (slabs). Dette krever `sudo`:

sudo vmstat -m | less

Resultatet har fem kolonner:

  • Cache: Navnet på cachen.
  • num: Antall aktive objekter i denne cachen.
  • total: Det totale antallet tilgjengelige objekter i denne cachen.
  • size: Størrelsen på hvert objekt i cachen.
  • pages: Totalt antall minnesider som er knyttet til denne cachen.

Trykk `q` for å avslutte `less`.

Hendelsestellere og minnestatistikk

Alternativet `-s` viser hendelsestellere og minnestatistikk.

vmstat -s

Statistikken er stort sett den samme som i standard `vmstat`-utdata, men noen er brutt ned i større detalj.

For eksempel viser standardutgangen kombinert bruker-CPU-tid i kolonnen «us», mens `-s`-utgangen viser denne statistikken separat for «nice» og «ikke-nice» bruker-CPU-tid.

Diskstatistikk

Alternativet `-d` gir deg en oversikt over diskstatistikk.

vmstat -d | less

For hver disk vises det tre kolonner: `Reads`, `Writes` og `IO`.

Kolonnen `IO` er plassert lengst til høyre. Merk at tidsenheten i `IO`-kolonnen er sekunder, mens tidsenheten i `Reads` og `Writes`-kolonnene er millisekunder.

Her er en forklaring av kolonnene:

Leser:

  • total: Totalt antall disklesninger.
  • merged: Totalt antall grupperte lesninger.
  • sectors: Totalt antall sektorer lest.
  • ms: Total tid brukt på å lese data fra disken (i millisekunder).

Skriver:

  • total: Totalt antall diskskrivinger.
  • merged: Totalt antall grupperte skrivinger.
  • sectors: Totalt antall sektorer skrevet til.
  • ms: Total tid brukt på å skrive data til disken (i millisekunder).

IO:

  • cur: Antall diskoperasjoner (lesing eller skriving) som pågår.
  • sec: Total tid brukt på pågående lesing eller skriving (i sekunder).

Sammendragsstatistikk for disk

For en rask oversikt over diskaktivitet, bruk `-D`-alternativet (disksum):

vmstat -D

Antallet disker kan virke uvanlig høyt. Dette skyldes at på systemer med snap-pakker opprettes et pseudo-filsystem som er koblet til en `/dev/loop`-enhet. Disse regnes som harddisker av mange Linux-verktøy.

Partisjonsstatistikk

For å se statistikk for en spesifikk partisjon, bruk `-p`-alternativet sammen med partisjonsidentifikatoren. Følgende viser statistikk for partisjon `sda1`:

vmstat -p sda1

Dette viser totalt antall disklesninger og -skrivinger til den partisjonen, samt antall sektorer som er lest og skrevet.

Under panseret

Det er alltid nyttig å se hva som skjer «under panseret». Noen ganger for å feilsøke problemer, andre ganger av ren interesse.

`vmstat` er et nyttig verktøy som gir deg detaljert informasjon om systemets ressursbruk. Nå vet du hvordan du bruker det, og hva den ulike statistikken betyr. Når du trenger å feilsøke eller forstå datamaskinens virkemåte, har du `vmstat` på din side.