Oprofile

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
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.
  • opreport n'associe pas toujours correctement les échantillons aux fonctions
 d'origine.
  • opcontrol accumule 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

Voir aussi

  • Nmon — monitoring de performance interactif
  • Sar — statistiques d'activité système (sysstat)