Perf- Et ytelsesovervåkings- og analyseverktøy for Linux


Når vi snakker om ytelse i databehandling, refererer vi til forholdet mellom ressursene våre og oppgavene som de lar oss fullføre i en gitt tidsperiode.

I en dag med hard konkurranse mellom bedrifter er det viktig at vi lærer å bruke det vi har på beste måte. Sløsing med maskinvare- eller programvareressurser, eller mangelen på evne til å vite hvordan de skal brukes mer effektivt, ender opp med å bli et tap som vi rett og slett ikke har råd til hvis vi ønsker å være på toppen av spillet vårt.

Samtidig må vi passe på å ikke ta ressursene våre til en grense hvor vedvarende bruk vil gi uopprettelig skade.

I denne artikkelen vil vi introdusere deg til et relativt nytt ytelsesanalyseverktøy og gi tips som du kan bruke til å overvåke Linux-systemene dine, inkludert maskinvare og applikasjoner. Dette vil hjelpe deg å sikre at de fungerer slik at du er i stand til å produsere de ønskede resultatene uten å kaste bort ressurser eller din egen energi.

Introduserer og installerer Perf i Linux

Linux tilbyr blant annet et ytelsesovervåkings- og analyseverktøy kalt praktisk perf. Så hva skiller perf fra andre velkjente verktøy som du allerede er kjent med?

Svaret er at perf gir tilgang til ytelsesovervåkingsenheten i CPU, og dermed lar oss se nærmere på oppførselen til maskinvaren og dens tilknyttede hendelser.

I tillegg kan den også overvåke programvarehendelser, og lage rapporter ut fra dataene som samles inn.

Du kan installere perf i RPM-baserte distribusjoner med:

yum update && yum install perf     [CentOS / RHEL / Fedora]
dnf update && dnf install perf     [Fedora 23+ releases]

I Debian og derivater:

sudo aptitude update && sudo aptitude install linux-tools-$(uname -r) linux-tools-generic

Hvis uname -r i kommandoen ovenfor returnerer ekstra strenger i tillegg til den faktiske versjonen (3.2.0-23-generisk i mitt tilfelle), må du kanskje skrive linux-tools-3.2.0-23 i stedet for å bruke utdataene til uname.

Det er også viktig å merke seg at perf gir ufullstendige resultater når de kjøres i en gjest på toppen av VirtualBox eller VMWare, da de ikke tillater tilgang til maskinvaretellere slik andre virtualiseringsteknologier (som KVM eller XEN) gjør .

Husk i tillegg at noen perf-kommandoer kan være begrenset til root som standard, som kan deaktiveres (til systemet startes på nytt) ved å gjøre:

echo 0 > /proc/sys/kernel/perf_event_paranoid

Hvis du trenger å deaktivere paranoid-modus permanent, oppdater følgende innstilling i filen /etc/sysctl.conf.

kernel.perf_event_paranoid = 0

Underkommandoer

Når du har installert perf, kan du henvise til man-siden for en liste over tilgjengelige underkommandoer (du kan tenke på underkommandoer som spesielle alternativer som åpner et spesifikt vindu i systemet). For best og mer fullstendig resultat, bruk perf enten som root eller gjennom sudo.

Perf liste

perf list (uten alternativer) returnerer alle symbolske hendelsestyper (lang liste). Hvis du vil se listen over tilgjengelige hendelser i en bestemt kategori, bruk perf-listen etterfulgt av kategorinavnet ([hw|sw|cache|tracepoint|pmu|event_glob ]), som for eksempel:

Vis liste over forhåndsdefinerte programvarehendelser i Linux:

perf list sw 

Perf stat

perf stat kjører en kommando og samler Linux-ytelsesstatistikk under utførelse av en slik kommando. Hva skjer i systemet vårt når vi kjører dd?

perf stat dd if=/dev/zero of=test.iso bs=10M count=1

Statistikken vist ovenfor indikerer blant annet:

  1. Utførelsen av dd-kommandoen tok 21,812281 millisekunder med CPU. Hvis vi deler dette tallet med verdien for «forløpte sekunder» nedenfor (23,914596 millisekunder), gir det 0,912 (CPU brukt).
  2. Mens kommandoen ble utført, indikerer 15 kontekstbrytere (også kjent som prosessbrytere) at CPU-ene ble byttet 15 ganger fra en prosess (eller tråd) til en annen.
  3. 2 CPU-migreringer er det forventede resultatet når arbeidsbelastningen i en 2-kjerners CPU er fordelt jevnt mellom antall kjerner.
    I løpet av den tiden (21,812281 millisekunder), var det totale antallet CPU-sykluser som ble forbrukt 62 025 623, som delt på 0,021812281 sekunder gir 2,843 GHz.
  4. Hvis vi deler antall sykluser med det totale antallet instruksjoner får vi 4,9 sykluser per instruksjon, som betyr at hver instruksjon tok nesten 5 CPU-sykluser å fullføre (i gjennomsnitt). Vi kan skylde dette (i det minste delvis) på antall grener og grenmisser (se nedenfor), som ender opp med å kaste bort eller misbruke CPU-sykluser.
  5. Da kommandoen ble utført, ble totalt 3 552 630 grener påtruffet. Dette er CPU-nivå representasjonen av beslutningspunkter og løkker i koden. Jo flere grener, jo lavere ytelse. For å kompensere for dette forsøker alle moderne CPUer å forutsi flyten koden vil ta. 51 348 grenmisser indikerer at prediksjonsfunksjonen var feil 1,45 % av tiden.

Det samme prinsippet gjelder for å samle statistikk (eller med andre ord, profilering) mens en applikasjon kjører. Bare start ønsket applikasjon og etter en rimelig tidsperiode (som er opp til deg) lukk den, og perf vil vise statistikken på skjermen. Ved å analysere disse statistikkene kan du identifisere potensielle problemer.

Perfekt topp

perf top ligner på toppkommando, ved at den viser en nesten sanntids systemprofil (også kjent som live analyse).

Med -a-alternativet vil du vise alle kjente hendelsestyper, mens -e-alternativet lar deg velge en spesifikk hendelseskategori (som returnert av perf list):

Viser alle sykluser.

perf top -a 

Vil vise alle CPU-klokkerelaterte hendelser.

perf top -e cpu-clock 

Den første kolonnen i utdataene ovenfor representerer prosentandelen av prøver tatt siden begynnelsen av kjøringen, gruppert etter funksjonssymbol og delt objekt. Flere alternativer er tilgjengelige i man perf-top.

Perf rekord

perf-posten kjører en kommando og lagrer de statistiske dataene i en fil som heter perf.data i gjeldende arbeidskatalog. Den kjører på samme måte som perf stat.

Skriv inn perf record etterfulgt av en kommando:

perf record dd if=/dev/null of=test.iso bs=10M count=1

Perf rapport

perf-rapport formaterer dataene samlet i perf.data ovenfor til en resultatrapport:

sudo perf report

Alle underkommandoene ovenfor har en dedikert man-side som kan påkalles som:

man perf-subcommand

der underkommando er enten liste, stat, topp, rekord eller >rapport. Dette er de mest brukte underkommandoene; andre er oppført i dokumentasjonen (se avsnittet Sammendrag for lenken).

Sammendrag

I denne veiledningen har vi introdusert deg for perf, et ytelsesovervåkings- og analyseverktøy for Linux. Vi oppfordrer deg sterkt til å gjøre deg kjent med dokumentasjonen som vedlikeholdes på https://perf.wiki.kernel.org.

Hvis du finner programmer som bruker en høy prosentandel av ressursene, kan du vurdere å endre kildekoden eller bruke andre alternativer.

Hvis du har spørsmål om denne artikkelen eller forslag til forbedringer, er vi alle ører. Kontakt oss gjerne ved å bruke kommentarskjemaet nedenfor.