23.2. Utiliser operf

operf est le mode de profilage recommandé et ne requiert pas de paramétrage initial avant d'être lancé. Tous les paramètres sont spécifiés comme options de ligne de commande et il n'y a pas de commande séparée pour lancer le processus de profilage. Pour arrêter operf, appuyez sur Ctrl+C. La syntaxe de la commande operf habituelle est comme suit :
operf options range command args
Remplacez options par les options de ligne de commande souhaitées pour spécifier vos paramètres de profilage. Des ensembles complets d'options sont décrits dans la page du manuel operf(1). Remplacez range par l'une des options suivantes :
--system-wide - ce paramètre permet d'effectuer un profilage global, veuillez consulter Note
--pid=PID - sert à profiler une application en cours d'exécution, où PID est l'ID du processus que vous souhaitez profiler.
Avec command et args, vous pouvez définir une commande ou une application spécifique à profiler, ainsi que les arguments d'entrée requis par cette commande ou application. command, --pid ou --system-wide est requis, mais ces options ne peuvent pas être utilisées simultanément.
Lorsque vous invoquez operf sur la ligne de commande sans paramétrer l'option range, des données seront collectées pour les processus enfants.

Note

Pour exécuter operf --system-wide, vous devrez être connecté avec les privilèges root. À la fin du profilage, vous pourrez arrêter operf avec Ctrl+C.
Si vous exécutez operf --system-wide en tant que processus d'arrière-plan (avec &), arrêtez-le de manière contrôlée pour traiter les données de profil collectées. Pour cela, veuillez utiliser :
kill -SIGINT operf-PID 
Lors de l'exécution de operf --system-wide, il est recommandé d'utiliser le répertoire /root ou un sous-répertoire de /root comme répertoire de travail actuel afin que les fichiers de données échantillons ne soient pas stockés dans des emplacements accessibles aux utilisateurs normaux.

23.2.1. Spécifier le noyau

Pour surveiller le noyau, veuillez exécuter la commande suivante :
operf --vmlinux=vmlinux_path
Avec cette option, vous pouvez spécifier un chemin vers un fichier vmlinux qui correspond au noyau en cours d'exécution. Les échantillons du noyau seront attribués à ce binaire en permettant aux outils post-traitement d'attribuer des échantillons aux symboles du noyau correspondant. Si cette option n'est pas spécifiée, tous les échantillons de noyau seront attribués à un pseudo binaire nommé « no-vmlinux ».

23.2.2. Paramétrer les événements à surveiller

La plupart des processeurs contiennent des compteurs, qui sont utilisés par OProfile pour surveiller des événements spécifiques. Comme affiché dans la Tableau 23.3, « Processeurs et compteurs OProfile », le nombre de compteurs disponibles dépend du processeur.
Les événements de chaque compteur peuvent être configurés via la ligne de commande ou avec une interface graphique. Pour obtenir plus d'informations sur l'interface graphique, veuillez consulter la Section 23.10, « Interface graphique ». Si le compteur ne peut pas être défini sur un événement particulier, un message d'erreur sera affiché.

Note

Certains anciens modèles de processeurs ne sont pas pris en charge par le noyau sous-jacent « Linux Performance Events Subsystem » et ne sont donc pas pris en charge par operf. Si vous recevez ce message :
Your kernel's Performance Events Subsystem does not support your processor type
lorsque vous tentez d'utiliser operf, essayez d'effectuer un profilage avec opcontrol pour voir si votre type de processeur pourrait être pris en charge par le mode hérité d'OProfile.

Note

Comme les compteurs de performance du matériel ne sont pas disponibles sur les machines virtuelles invitées, il faut activer le mode timer pour utiliser operf sur des systèmes virtuels. Pour cela, veuillez saisir en tant qu'utilisateur root :
opcontrol --deinit
modprobe oprofile timer=1
Pour paramétrer l'événement pour chaque compteur configurable via la ligne de commande, veuillez utiliser :
operf --events=event1,event2
Veuillez saisir une liste séparée par des virgules des spécifications d'événements pour le profilage. Chaque spécification est une liste d'attributs séparés par le caractère des deux-points sous le format suivant :
event-name:sample-rate:unit-mask:kernel:user
Tableau 23.2, « Spécifications d'événement » résume ces options. Les trois dernières valeurs sont optionnelles. Si vous les omettez, elles seront paramétrées sur leurs valeurs par défaut. Remarquez que certains événements requièrent un masque d'unité.

Tableau 23.2. Spécifications d'événement

SpécificationDescription
event-nameNom de l'événement symbolique exact pris de ophelp
sample-rateNombre d'événements à attendre avant d'échantillonner à nouveau. Plus le compte est faible, plus les échantillons sont fréquents. Pour les événements qui ne se produisent pas fréquemment, un compte plus faible peut être nécessaire pour capturer un nombre statistiquement significatif d'instances d'événements. D'un autre côté, un échantillonnage trop fréquent peut surcharger le système. Par défaut, OProfile utilise un ensemble d'événements basé temps, ce qui crée un échantillon tous les 100,000 cycles d'horloge par processeur.
unit-maskLes masques d'unité, qui définissent encore plus l'événement, sont répertoriés dans ophelp. Vous pouvez insérer une valeur hexadécimale, commençant par « 0x », ou une chaîne qui correspond au premier mot de la description du masque d'unité dans ophelp. La définition par nom est valide pour les masques d'unité comprenant des paramètres « extra: », comme indiqué par la sortie de ophelp. Ce type de masque d'unité ne peut pas être défini avec une valeur hexadécimale. Remarquez que sur certaines architectures, il peut y avoir de multiples masques d'unité avec la même valeur hexadécimale. Dans ce cas, ils devront être spécifiés par leurs nom uniquement.
kernelIndique s'il faut profiler le code du noyau (insérez 0 ou 1 (par défaut))
userIndique s'il faut profiler le code de l'espace utilisateur (insérez 0 ou 1 (par défaut))
Les événements disponibles varient fortement selon le type du processeur. Lorsqu'aucune spécification n'est donnée, l'événement par défaut du type de processeur en cours d'exécution sera utilisé pour le profilage. Veuillez consulter la Tableau 23.4, « Événements par défaut » pour voir une liste de ces événements par défaut. Pour déterminer les événements disponibles pour un profilage, veuillez utiliser la commande ophelp.
ophelp

23.2.3. Catégorisation des échantillons

L'option --separate-thread catégorise les échantillons par ID de groupe de thread (tgid) et par ID de thread (tid). Ceci est utile pour voir les échantillons par thread dans les applications à threads multiples. Lorsqu'utilisé en conjonction avec l'option --system-wide, --separate-thread est également utile pour voir les échantillons par processus (par groupe de threads) dans le cas où de multiples processus seraient exécutés par le même programme pendant l'exécution d'un profilage.
L'option --separate-cpu catégorises les échantillons par CPU.