Oprofile
| Fiche express | |
|---|---|
| Domaine | Profiling CPU / compteurs matériels (performance monitoring) |
| Commande | opcontrol, operf, opreport...
|
| Contexte | Historique — largement remplacé par perf/perf_events sur les noyaux récents |
| Voir aussi | Nmon, Sar (monitoring de performance) |
OProfile est un système de profiling de performance pour Linux à faible overhead : il
s'appuie sur les compteurs de performance matériels (hardware performance counters) du
processeur pour échantillonner l'activité et remonter les statistiques au noyau. Depuis
l'intégration du sous-système perf_events dans le noyau (2.6.31, 2009) et la
généralisation de l'outil perf, OProfile est devenu un outil essentiellement
historique — utile pour maintenir ou analyser d'anciens systèmes, mais plus le choix par
défaut sur les distributions récentes.
Limitations connues
- Les bibliothèques partagées (shared libraries) ne sont pas attribuées à une application
spécifique, sauf à utiliser l'option --separate=library.
- Les échantillons de profiling sont imprécis par nature (approximation statistique) ; les
divisions par zéro notamment donnent des résultats peu fiables.
opreportn'associe pas toujours correctement les échantillons aux fonctions
d'origine.
opcontrolaccumule les résultats d'une session à l'autre, y compris après un
reboot — penser à opcontrol --reset pour repartir d'une base propre.
- Les compteurs matériels ne fonctionnent pas nativement sur les machines virtuelles ; il faut
forcer le mode timer (voir ci-dessous).
- Performances dégradées sur les charges non limitées par le CPU (NON-CPU-LIMITED).
Commandes principales
ophelp # liste des évènements de profiling disponibles sur le CPU
opimport
opannotate # annote le code source avec les résultats de profiling
opcontrol # pilotage historique (legacy)
operf # pilotage moderne, ne nécessite pas opcontrol
opreport # génère les rapports
oprofiled # démon de collecte
operf
operf est l'interface moderne d'OProfile (remplace opcontrol --start
pour le lancement d'une session) :
operf [options] range command args
operf --system-wide # profiler l'ensemble du système
operf --pid=PID # profiler un processus applicatif spécifique
operf --vmlinux=vmlinux_path # profiler le kernel (chemin vers l'image vmlinux avec symboles)
Spécifier un évènement précis :
operf --events=event1,event2…
# format : event-name:sample-rate:unit-mask:kernel:user
- event-name : nom de l'évènement matériel (voir
ophelp) - sample-rate : seuil d'échantillonnage de l'évènement
- unit-mask : valeur hexadécimale (
0x...) ou début du nom de la chaîne recherchée - kernel : profiler le code noyau (0 ou 1, 1 par défaut)
- user : profiler le code user-space (0 ou 1, 1 par défaut)
Autres options utiles : --separate-thread, --separate-cpu.
Profiling sous machine virtuelle
Les compteurs matériels n'étant pas exposés aux VM, il faut forcer le mode timer :
opcontrol --deinit
modprobe oprofile timer=1
Mode legacy (opcontrol)
Configuration initiale :
opcontrol --setup --vmlinux=/usr/lib/debug/lib/modules/`uname -r`/vmlinux
opcontrol --setup --no-vmlinux
Cycle de vie d'une session :
opcontrol --start # démarrage — écrit dans /var/lib/oprofile/samples/
opcontrol --dump # forcer l'écriture des échantillons en cours
opcontrol --save=name # sauvegarde -> /var/lib/oprofile/samples/name/
opcontrol --shutdown # arrêt
opcontrol --reset # réinitialise les résultats accumulés
Exemple pour un profiling ciblé sur un évènement (ex. processeur Westmere) :
opcontrol --setup --vmlinux=/usr/lib/debug/lib/modules/`uname -r`/vmlinux --event=CPU_CLK_UNHALTED:500000
opreport /ext4 -l --image-path /lib/modules/`uname -r`/kernel
En mode legacy, les informations exploitées par OProfile sont indiquées dans
/dev/oprofile/.
Watchdog NMI et perf
Le nmi_watchdog s'enregistre lui aussi via le sous-système perf. Pour éviter
tout conflit avec OProfile, le désactiver le temps du profiling :
echo 0 > /proc/sys/kernel/nmi_watchdog # désactiver
echo 1 > /proc/sys/kernel/nmi_watchdog # réactiver
Analyse des résultats
Par défaut, operf enregistre les données dans ./oprofile_data (le
répertoire courant) ; l'option --session-dir permet de choisir un autre
emplacement. Si ce répertoire n'existe pas, le système retombe sur
/var/lib/oprofile/.
opreport
opreport -l -i __gconv_transform_utf8_internal /lib/tls/libc-version.so
opreport -d -i __gconv_transform_utf8_internal /lib/tls/libc-version.so
opannotate --search-dirs src-dir --source executable
Profiling Java
Ajouter au démarrage de la JVM l'agent correspondant à l'architecture :
# 64 bits
-agentlib:jvmti_oprofile
# 32 bits
-agentlib:/usr/lib64/oprofile/libjvmti_oprofile.so
Interface graphique
yum install oprofile-gui
oprof_start