Linux: comando “perf” per il profiling delle prestazioni del sistema

INFORMATICA, LINUX, TUTORIAL

Il comando perf, abbreviazione di “performance”, è uno strumento potente e versatile presente nei sistemi operativi basati su Linux. Progettato per il profiling delle prestazioni del sistema, aiuta sviluppatori, sistemisti e utenti avanzati a comprendere il comportamento delle applicazioni e a ottimizzarne le prestazioni.

Introdotto nel kernel Linux 2.6.31, perf offre una suite di strumenti per monitorare eventi di performance come contatori hardware (ad esempio, cicli CPU, cache miss), eventi software (ad esempio, fault di pagina, context switch), eventi personalizzati e tracciamento di funzioni. La sua versatilità lo rende utile per operazioni che spaziano dall’analisi di problemi di bassa latenza al miglioramento della scalabilità di applicazioni su larga scala.

Applicazioni del comando ‘perf’

Le applicazioni di perf sono molteplici. Ecco alcune delle principali:

  • Profiling del sistema: perf fornisce una panoramica dettagliata dei consumi di risorse del sistema, evidenziando i maggiori utilizzi di CPU, memoria, I/O e altre risorse critiche. Questo è cruciale per identificare colli di bottiglia e ottimizzare l’allocazione delle risorse.
  • Analisi del runtime delle applicazioni: Con perf è possibile misurare il tempo di esecuzione delle funzioni all’interno di un’applicazione, determinando le parti del codice più onerose dal punto di vista computazionale per ottimizzarle.
  • Monitoraggio dei contatori hardware: perf consente di accedere a una serie di contatori hardware come cicli, cache miss e branch miss, offrendo una visione dettagliata delle performance hardware.
  • Eventi software: Consente di monitorare eventi software come fault di pagina e context switch, influenzando le prestazioni delle applicazioni.
  • Tracciamento delle chiamate di sistema: perf permette di tracciare le chiamate di sistema per ottimizzarne l’uso, identificando le syscalls più frequenti.

Esempio di utilizzo

Uno degli usi comuni di perf è il comando perf stat per ottenere statistiche di performance di un programma. Ad esempio, per monitorare un’applicazione chiamata applicazione:

$ perf stat ./applicazione

Questo comando fornirà statistiche sull’esecuzione di applicazione, come cicli CPU e istruzioni eseguite. Un altro comando utile è perf record, per registrare eventi analizzabili successivamente con perf report.

In sintesi, perf è uno strumento essenziale per qualsiasi professionista IT che lavori in ambiente Linux, offrendo una vasta gamma di funzionalità per comprendere e ottimizzare le prestazioni del sistema.

Installazione e configurazione di ‘perf’ su Linux

Prima di sfruttare le funzionalità di perf, è necessario installarlo e configurarlo correttamente. Seguono i dettagli su come farlo.

Prerequisiti

Assicurati di avere privilegi di root o di poter utilizzare sudo. Idealmente, il kernel Linux deve essere almeno alla versione 2.6.31, poiché perf è stato introdotto con tale versione.

Installazione Ubuntu/Debian

Usa il gestore di pacchetti per installare perf:

sudo apt update
sudo apt install linux-perf

Fedora

Installa perf con:

sudo dnf install perf

Arch Linux

Su Arch Linux, perf può essere installato con:

sudo pacman -S perf

Configurazione

Dopo l’installazione, configura perf per massimizzare la sua efficacia. Uno degli aspetti cruciali è l’accesso ai contatori hardware, che può richiedere l’esecuzione come root. Per consentire agli utenti non privilegiati di utilizzare perf, modifica il valore di perf_event_paranoid:

echo 1 | sudo tee /proc/sys/kernel/perf_event_paranoid

Per rendere permanente la modifica, aggiungi questa riga a /etc/sysctl.conf:

kernel.perf_event_paranoid=1

Applica la modifica con:

sudo sysctl -p

Verifica dell’Installazione

Verifica che perf sia installato correttamente eseguendo:

perf --version

Se il comando restituisce una versione, l’installazione è andata a buon fine.

Sessioni di profiling e raccolta dati

Una volta installato e configurato correttamente, perf può fornire dati dettagliati sulle prestazioni del sistema. Esploriamo alcune delle sue funzionalità avanzate per il profiling.

Sessioni di Profiling di Base

Uno dei comandi più usati è perf stat, che raccoglie statistiche di performance durante l’esecuzione di un comando. Ad esempio:

sudo perf stat -e cpu-clock,task-clock,cycles,instructions,cache-references,cache-misses,branches,branch-misses sleep 5

Questo comando monitora vari eventi legati alla CPU durante l’esecuzione del comando sleep 5, offrendo una panoramica delle prestazioni del sistema.

Profiling delle Funzioni del Kernel

Con perf record e perf report, è possibile registrare e analizzare i dati di performance. Esempio:

sudo perf record -e cycles -c 10000 -p <PID>
sudo perf report

Questo consente di identificare le funzioni del kernel più onerose in termini di risorse.

Analisi degli Eventi Hardware e Software

perf può monitorare sia eventi hardware che software. Ad esempio, per monitorare i page faults di un processo:

sudo perf stat -e page-faults -p <PID>

Analogamente, possono essere monitorati altri eventi specificando l’evento desiderato.

Visualizzazione Grafica e Analisi Avanzata

Per chi desidera una visualizzazione grafica, strumenti come FlameGraph possono essere utilizzati in combinazione con perf per creare grafici a fiamma.

sudo perf script | ./flamegraph.pl > perf-flame.svg

Questo processo converte i dati registrati in un grafico a fiamma visualizzabile in un browser web, facilitando la comprensione visiva delle prestazioni del sistema.

Utilizzo avanzato di ‘perf’ per il debugging delle performance

Oltre alle funzionalità di base, perf offre opzioni avanzate per un’analisi più dettagliata delle prestazioni del sistema. Queste funzionalità sono utili per identificare problemi complessi di performance.

Analisi Dinamica con perf probe

perf probe permette di inserire “sonde” dinamiche nel codice del kernel per raccogliere dati specifici. Ad esempio, per aggiungere una sonda su una funzione del kernel:

sudo perf probe do_sys_open

Quindi, registra e analizza l’attività:

sudo perf record -e probe:do_sys_open -aR sleep 10
sudo perf report

Individuazione dei Bottleneck con perf top

perf top fornisce una visualizzazione interattiva in tempo reale delle funzioni che consumano più risorse:

sudo perf top

Analisi degli Eventi di Controllo GPM e Off-CPU

perf può tracciare anche eventi off-CPU come i processi in attesa di I/O. Con perf sched, ottieni dati dettagliati sui contesti di scheduling del kernel:

sudo perf sched record -a
sudo perf sched latency

Prestazioni con perf c2c

Il plugin perf c2c analizza la coerenza e la condivisione della cache tra diversi core della CPU:

sudo perf c2c record -aR sleep 5
sudo perf c2c report

Questo rapporto evidenzia i problemi di condivisione della cache, fornendo suggerimenti su come migliorare l’efficienza della cache.

Utilizzo di ‘perf’ per ottimizzare le applicazioni

Il comando perf è uno degli strumenti più versatili per il profiling delle prestazioni su Linux. Con una vasta gamma di funzionalità, permette di eseguire analisi dettagliate delle prestazioni del sistema e delle applicazioni. Utilizzare perf correttamente può aiutare a identificare e ottimizzare i punti critici di performance.

Esempi Pratici con Comandi

Dopo aver installato perf con il gestore di pacchetti della tua distribuzione, puoi iniziare a utilizzarlo per varie operazioni di profiling. Vediamo alcuni esempi.

Analisi delle Funzioni con ‘perf record’ e ‘perf report’

Il comando perf record cattura dati di performance che possono essere analizzati con perf report. Per analizzare le performance di un’applicazione chiamata my_app:

sudo perf record -g ./my_app
sudo perf report

Il flag -g cattura la call graph, utile per identificare le funzioni più onerose dal punto di vista delle prestazioni.

Monitoraggio delle I/O con ‘perf stat’

perf stat fornisce una panoramica generale delle prestazioni del sistema, comprese le statistiche sull’I/O:

sudo perf stat -e task-clock,cycles,instructions,cache-references,cache-misses,branches,branch-misses,context-switches,cpu-migrations,page-faults

Questo comando raccoglie varie metriche di sistema in un singolo riepilogo.

Profiling Mirato con ‘perf script’

perf script permette di estrarre e analizzare dati di eventi specifici:

sudo perf record -e cpu-clock -a -g -- sleep 5
sudo perf script

Questo comando registra eventi specifici di clock della CPU per 5 secondi e li presenta in un formato leggibile.

Visualizzazione Grafica con ‘perf report -g’

Per ottenere una visualizzazione grafica delle chiamate alle funzioni, utilizza il flag -g con perf report:

sudo perf record -g -- ./my_app
sudo perf report -g 'graph,0.5,callee'

Questa rappresentazione visuale aiuta a identificare facilmente i punti caldi delle prestazioni.

 

Se vuoi farmi qualche richiesta o contattarmi per un aiuto riempi il seguente form