Perf- Et ydelsesovervågnings- og analyseværktøj til Linux


Når vi taler om ydeevne inden for computing, henviser vi til forholdet mellem vores ressourcer og de opgaver, de giver os mulighed for at udføre i en given tidsperiode.

På en dag med hård konkurrence mellem virksomheder er det vigtigt, at vi lærer at bruge det, vi har, bedst muligt. Spild af hardware- eller softwareressourcer eller manglen på evne til at vide, hvordan man bruger dem mere effektivt, ender med at blive et tab, som vi bare ikke har råd til, hvis vi vil være øverst i vores spil.

Samtidig skal vi være forsigtige med ikke at bringe vores ressourcer til en grænse, hvor vedvarende brug vil give uoprettelig skade.

I denne artikel vil vi introducere dig til et relativt nyt ydeevne-analyseværktøj og give tip, som du kan bruge til at overvåge dine Linux-systemer, herunder hardware og applikationer. Dette hjælper dig med at sikre, at de fungerer, så du er i stand til at producere de ønskede resultater uden at spilde ressourcer eller din egen energi.

Introduktion og installation af Perf i Linux

Blandt andet leverer Linux et ydeevneovervågnings- og analyseværktøj kaldet praktisk perf. Så hvad adskiller perf fra andre kendte værktøjer, som du allerede er bekendt med?

Svaret er, at perf giver adgang til Performance Monitoring Unit i CPU'en og dermed giver os mulighed for at se nærmere på hardwareens opførsel og dens tilknyttede begivenheder.

Derudover kan den også overvåge softwarehændelser og oprette rapporter ud af de data, der indsamles.

Du kan installere perf i RPM-baserede distributioner 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 strenge udover den aktuelle version (3.2.0-23-generisk i mit tilfælde), skal du muligvis skrive linux-tools-3.2.0-23 i stedet af at bruge output af uname.

Det er også vigtigt at bemærke, at perf giver ufuldstændige resultater, når de køres i en gæst oven på XEN).

Derudover skal du huske på, at nogle perf-kommandoer som standard kan være begrænset til root, som kan deaktiveres (indtil systemet genstartes) ved at gøre:

# echo 0 > /proc/sys/kernel/perf_event_paranoid

Hvis du har brug for at deaktivere paranoidtilstand permanent, skal du opdatere følgende indstilling i /etc/sysctl.conf-filen.

kernel.perf_event_paranoid = 0

Når du har installeret perf, kan du henvise til dens man-side for en liste over tilgængelige underkommandoer (du kan tænke på underkommandoer som specielle indstillinger, der åbner et specifikt vindue i systemet). For de bedste og mere komplette resultater skal du bruge perf enten som rod eller gennem sudo.

perf-liste (uden optioner) returnerer alle de symbolske begivenhedstyper (lang liste). Hvis du vil se listen over begivenheder, der er tilgængelige i en bestemt kategori, skal du bruge perf-listen efterfulgt af kategorienavnet ([hw | sw | cache | tracepoint | pmu | event_glob]), såsom:

Vis liste over foruddefinerede begivenheder i Linux:

# perf list sw 

perf stat kører en kommando og indsamler Linux-præstationsstatistikker under udførelsen af en sådan kommando. Hvad sker der i vores system, når vi kører dd?

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

Statistikken vist ovenfor angiver blandt andet:

  1. Udførelsen af dd-kommandoen tog 21.812281 millisekunder CPU. Hvis vi deler dette tal med "sekunder forløbet tid" -værdien under (23,914596 millisekunder), giver det 0,912 (CPU benyttet).
  2. Mens kommandoen blev udført, angiver 15 kontekstskiftere (også kendt som processkiftere), at CPU'erne blev skiftet 15 gange fra en proces (eller tråd) til en anden.
  3. 2 CPU-migreringer er det forventede resultat, når arbejdsbelastningen fordeles jævnt i en 2-kernet CPU mellem antallet af kerner.
    I løbet af denne tid (21.812281 millisekunder) var det samlede antal CPU-cyklusser, der blev forbrugt, 62.025.623, hvilket divideret med 0.021812281 sekunder giver 2.843 GHz.
  4. Hvis vi deler antallet af cyklusser med det samlede antal instruktioner, får vi 4,9 cykler pr. instruktion, hvilket betyder, at hver instruktion tog næsten 5 CPU-cyklusser at gennemføre (i gennemsnit). Vi kan bebrejde dette (i det mindste delvist) antallet af filialer og filialfejl (se nedenfor), som ender med at spilde eller misbruge CPU-cyklusser.
  5. Da kommandoen blev udført, blev der i alt 3.552.630 grene stødt på. Dette er CPU-niveau repræsentation af beslutningspunkter og sløjfer i koden. Jo flere grene, jo lavere er ydeevnen. For at kompensere for dette forsøger alle moderne CPU'er at forudsige det flow, koden vil tage. 51.348 forgreninger angiver, at forudsigelsesfunktionen var forkert 1,45% af tiden.

Det samme princip gælder for indsamling af statistik (eller med andre ord profilering), mens en applikation kører. Start blot det ønskede program, og luk det efter en rimelig periode (som det er op til dig), og perf vil vise statistikken på skærmen. Ved at analysere disse statistikker kan du identificere potentielle problemer.

perf top svarer til øverste kommando, idet den viser en næsten realtids systemprofil (også kendt som live analyse).

Med indstillingen -a viser du alle de kendte begivenhedstyper, mens indstillingen -e giver dig mulighed for at vælge en bestemt begivenhedskategori (som returneres af perf-listen) :

Viser alle cykler begivenhed.

perf top -a 

Viser alle cpu-ur-relaterede begivenheder.

perf top -e cpu-clock 

Den første kolonne i output ovenfor repræsenterer procentdelen af prøver, der er taget siden starten af kørslen, grupperet efter funktionssymbol og delt objekt. Flere muligheder er tilgængelige i man perf-top.

perf record kører en kommando og gemmer de statistiske data i en fil med navnet perf.data i den aktuelle arbejdsmappe. Det kører på samme måde som perf stat.

Skriv perf-rekord efterfulgt af en kommando:

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

perf rapport formaterer de data, der er indsamlet i perf.data ovenfor, i en præstationsrapport:

# sudo perf report

Alle ovenstående underkommandoer har en dedikeret mandeside, der kan påberåbes som:

# man perf-subcommand

hvor underkommando er enten liste, stat, top, post eller rapport. Disse er de hyppigst anvendte underkommandoer; andre er angivet i dokumentationen (se afsnittet Resume for linket).

Resumé

I denne vejledning har vi introduceret dig til perf, et ydeevneovervågnings- og analyseværktøj til Linux. Vi opfordrer dig stærkt til at blive fortrolig med dens dokumentation, der er vedligeholdt på https://perf.wiki.kernel.org.

Hvis du finder applikationer, der bruger en høj procentdel af ressourcer, kan du overveje at ændre kildekoden eller bruge andre alternativer.

Hvis du har spørgsmål om denne artikel eller forslag til forbedring, er vi alle ører. Du er velkommen til at kontakte os ved hjælp af nedenstående kommentarformular.