Perf: una eina de seguiment i anàlisi del rendiment per a Linux


Quan parlem de rendiment en informàtica, ens referim a la relació entre els nostres recursos i les tasques que ens permeten realitzar en un període de temps determinat.

En un dia de competència aferrissada entre empreses, és important que aprenem a utilitzar el que tenim al màxim. El malbaratament de recursos de maquinari o programari, o la manca de capacitat per saber com utilitzar-los de manera més eficient, acaba sent una pèrdua que no ens podem permetre si volem estar al capdavant del nostre joc.

Al mateix temps, hem d'anar amb compte de no portar els nostres recursos a un límit on l'ús sostingut produeixi danys irreparables.

En aquest article us presentarem una eina d'anàlisi de rendiment relativament nova i us oferirem consells que podeu utilitzar per supervisar els vostres sistemes Linux, inclosos el maquinari i les aplicacions. Això us ajudarà a assegurar-vos que funcionin de manera que pugueu produir els resultats desitjats sense malgastar recursos ni la vostra pròpia energia.

Presentació i instal·lació de Perf a Linux

Entre d'altres, Linux ofereix una eina de monitoratge i anàlisi del rendiment anomenada conveniently perf. Aleshores, què distingeix el rendiment d'altres eines conegudes amb les quals ja coneixeu?

La resposta és que perf proporciona accés a la Unitat de Monitorització del Rendiment de la CPU i, per tant, ens permet veure de prop el comportament del maquinari i els seus esdeveniments associats.

A més, també pot supervisar esdeveniments de programari i crear informes a partir de les dades que es recullen.

Podeu instal·lar perf en distribucions basades en RPM amb:

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

A Debian i derivats:

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

Si uname -r a l'ordre anterior retorna cadenes addicionals a més de la versió real (3.2.0-23-generic en el meu cas), potser haureu d'escriure linux-tools-3.2.0-23. d'utilitzar la sortida d'uname.

També és important tenir en compte que perf produeix resultats incomplets quan s'executa en un convidat a sobre de XEN).

A més, tingueu en compte que algunes ordres perf poden estar restringides a root per defecte, que es poden desactivar (fins que es reiniciï el sistema) fent:

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

Si necessiteu desactivar el mode paranoic permanentment, actualitzeu la configuració següent al fitxer /etc/sysctl.conf.

kernel.perf_event_paranoid = 0

Un cop hàgiu instal·lat perf, podeu consultar la seva pàgina de manual per obtenir una llista de subordres disponibles (podeu pensar en les subordres com a opcions especials que obren una finestra específica al sistema). Per obtenir resultats millors i més complets, utilitzeu perf com a root o mitjançant sudo.

perf list (sense opcions) retorna tots els tipus d'esdeveniments simbòlics (llista llarga). Si voleu veure la llista d'esdeveniments disponibles en una categoria específica, utilitzeu la llista perf seguida del nom de la categoria ([hw|sw|cache|tracepoint|pmu|event_glob]), com ara:

Mostra la llista d'esdeveniments predefinits de programari a Linux:

# perf list sw 

perf stat executa una ordre i recopila estadístiques de rendiment de Linux durant l'execució d'aquesta ordre. Què passa al nostre sistema quan executem dd?

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

Les estadístiques mostrades anteriorment indiquen, entre altres coses:

  1. L'execució de l'ordre dd va trigar 21,812281 mil·lisegons de CPU. Si dividim aquest nombre pel valor de \segons de temps transcorreguts a continuació (23,914596 mil·lisegons), s'obté 0,912 (CPU utilitzada).
  2. Mentre s'executava l'ordre, 15 canvis de context (també coneguts com a canvis de procés) indiquen que les CPU es van canviar 15 vegades d'un procés (o fil) a un altre.
  3. 2 migracions de CPU és el resultat esperat quan en una CPU de 2 nuclis la càrrega de treball es distribueix uniformement entre el nombre de nuclis.
    Durant aquest temps (21,812281 mil·lisegons), el nombre total de cicles de CPU que es van consumir va ser de 62.025.623, que dividit per 0,021812281 segons dóna 2,843 GHz.
  4. Si dividim el nombre de cicles pel recompte total d'instruccions obtenim 4,9 cicles per instrucció, la qual cosa significa que cada instrucció ha trigat gairebé 5 cicles de CPU a completar-se (de mitjana). Podem culpar d'això (almenys en part) al nombre de branques i errors de branques (vegeu més avall), que acaben malgastant o fent mal ús dels cicles de la CPU.
  5. A mesura que s'executava l'ordre, es van trobar un total de 3.552.630 branques. Aquesta és la representació a nivell de CPU dels punts de decisió i dels bucles del codi. Com més branques, menor és el rendiment. Per compensar això, totes les CPU modernes intenten predir el flux que prendrà el codi. 51.348 errors de branca indiquen que la funció de predicció era incorrecta l'1,45% del temps.

El mateix principi s'aplica a la recopilació d'estadístiques (o, en altres paraules, a la creació de perfils) mentre s'està executant una aplicació. Simplement inicieu l'aplicació desitjada i després d'un període de temps raonable (que depèn de vosaltres) tanqueu-la i perf mostrarà les estadístiques a la pantalla. Mitjançant l'anàlisi d'aquestes estadístiques, podeu identificar possibles problemes.

perf top és similar al comandament superior, ja que mostra un perfil del sistema gairebé en temps real (també conegut com a anàlisi en directe).

Amb l'opció -a mostrareu tots els tipus d'esdeveniments coneguts, mentre que l'opció -e us permetrà triar una categoria d'esdeveniment específica (tal com retorna la llista de perf). :

Mostrarà l'esdeveniment de tots els cicles.

perf top -a 

Mostrarà tots els esdeveniments relacionats amb el rellotge de la CPU.

perf top -e cpu-clock 

La primera columna de la sortida anterior representa el percentatge de mostres preses des de l'inici de l'execució, agrupades per funció Símbol i Objecte compartit. Hi ha més opcions disponibles a man perf-top.

perf record executa una ordre i desa les dades estadístiques en un fitxer anomenat perf.data dins del directori de treball actual. Funciona de manera similar a perf stat.

Escriviu el registre perf seguit d'una ordre:

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

L'informe de rendiment forma les dades recollides a perf.data anterior en un informe de rendiment:

# sudo perf report

Totes les subordres anteriors tenen una pàgina man dedicada que es pot invocar com:

# man perf-subcommand

on la subordre és llista, estadística, superior, registre o informe. Aquestes són les subordres més utilitzades; d'altres s'enumeren a la documentació (consulteu l'enllaç a la secció Resum).

Resum

En aquesta guia us hem presentat perf, una eina de control i anàlisi del rendiment per a Linux. Us recomanem que us familiaritzeu amb la seva documentació que es manté a https://perf.wiki.kernel.org.

Si trobeu aplicacions que consumeixen un percentatge elevat de recursos, podeu considerar modificar el codi font o utilitzar altres alternatives.

Si teniu preguntes sobre aquest article o suggeriments per millorar, tots som oïdes. No dubteu a posar-vos en contacte amb nosaltres mitjançant el formulari de comentaris a continuació.