Comment vérifier si un point de trace (tracepoint) du noyau est actif sous Linux

LinuxLinuxBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire (lab), nous allons explorer comment vérifier si un point de trace (tracepoint) du noyau est actif sous Linux. Les points de trace sont essentiels pour observer les événements du noyau et sont inestimables pour le débogage et l'analyse des performances. Nous commencerons par lister les points de trace disponibles sur votre système en utilisant le système de fichiers /sys/kernel/debug/tracing.

Après cette exploration initiale, nous apprendrons à vérifier l'état de points de trace spécifiques à l'aide de l'utilitaire trace-cmd et, enfin, nous vérifierons les points de trace en examinant le fichier /proc/kallsyms.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux(("Linux")) -.-> linux/PackagesandSoftwaresGroup(["Packages and Softwares"]) linux/BasicFileOperationsGroup -.-> linux/ls("Content Listing") linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/TextProcessingGroup -.-> linux/grep("Pattern Searching") linux/PackagesandSoftwaresGroup -.-> linux/apt("Package Handling") subgraph Lab Skills linux/ls -.-> lab-558726{{"Comment vérifier si un point de trace (tracepoint) du noyau est actif sous Linux"}} linux/cat -.-> lab-558726{{"Comment vérifier si un point de trace (tracepoint) du noyau est actif sous Linux"}} linux/grep -.-> lab-558726{{"Comment vérifier si un point de trace (tracepoint) du noyau est actif sous Linux"}} linux/apt -.-> lab-558726{{"Comment vérifier si un point de trace (tracepoint) du noyau est actif sous Linux"}} end

Lister les points de trace (tracepoints) avec ls /sys/kernel/debug/tracing

Dans cette étape, nous allons commencer à explorer les points de trace (tracepoints) Linux. Les points de trace sont des points d'accrochage (hooks) placés dans le code source du noyau qui vous permettent d'observer des événements spécifiques se produisant à l'intérieur du noyau. Ils sont inestimables pour le débogage et l'analyse des performances.

Le noyau Linux fournit un cadre de suivi (tracing framework), souvent accessible via le répertoire /sys/kernel/debug/tracing. Ce répertoire contient divers fichiers qui contrôlent et fournissent des informations sur le suivi.

Pour voir les points de trace disponibles sur votre système, vous pouvez lister le contenu du répertoire events dans le système de fichiers de suivi.

Ouvrez votre terminal s'il n'est pas déjà ouvert. N'oubliez pas que vous pouvez trouver l'icône Xfce Terminal sur le côté gauche de votre bureau.

Maintenant, tapez la commande suivante et appuyez sur Entrée :

ls /sys/kernel/debug/tracing/events

Cette commande utilise ls pour lister le contenu du répertoire /sys/kernel/debug/tracing/events. Le répertoire events est là où le noyau expose les points de trace disponibles, organisés par sous-système.

Vous verrez une liste de répertoires, chacun représentant un sous-système du noyau (comme syscalls, sched, ext4, etc.). À l'intérieur de ces répertoires se trouvent les noms réels des points de trace.

Par exemple, vous pourriez voir une sortie similaire à celle-ci (la sortie exacte variera en fonction de la version et de la configuration de votre noyau) :

block/      ext4/       kmem/       net/        pci/        random/     sock/       task/       workqueue/
bpf/        fib/        kvm/        nfs/        power/      raw_syscalls/ signal/     timer/      xfs/
compaction/ ftrace/     libata/     nipi/       printk/     regmap/     skb/        udp/        xen/
cpu-freq/   gpio/       mdio/       oom/        qdisc/      rpm/        snd/        vmscan/
cgroup/     header_event  header_page  irq/        migrate/    pagemap/    ras/        scsi/       spi/        writeback/
dma_fence/  i2c/        kcsan/      module/     perf_events/  rcu/        sfc/        syscalls/   xhci-hcd/
enable      iommu/      kprobe/     mpx/        powerpc/    regulator/  signal/     tcp/        xilinx-vsec/
exceptions/ iov/        kscan/      napi/       probe/      rpm/        skb/        timer/      xfs/

Cette sortie montre les différentes catégories d'événements que vous pouvez suivre. Dans les étapes suivantes, nous apprendrons à vérifier l'état de ces points de trace.

Cliquez sur Continuer pour passer à l'étape suivante.

Vérifier l'état des points de trace (tracepoints) avec trace-cmd

Dans l'étape précédente, nous avons listé les points de trace disponibles en explorant le répertoire /sys/kernel/debug/tracing/events. Maintenant, utilisons l'utilitaire trace-cmd pour obtenir des informations plus détaillées sur les points de trace, en particulier leur état (s'ils sont activés ou désactivés).

La commande trace-cmd est un outil puissant pour interagir avec le cadre de suivi (tracing framework) Linux. Si trace-cmd n'est pas déjà installé, vous pouvez l'installer en utilisant apt.

Tout d'abord, mettez à jour la liste des paquets :

sudo apt update

Ensuite, installez trace-cmd :

sudo apt install trace-cmd

Vous pourriez voir une sortie indiquant que trace-cmd est déjà installé, ce qui n'est pas un problème.

Maintenant, pour lister tous les points de trace disponibles et leur état, utilisez la commande trace-cmd list -e. L'option -e indique à trace-cmd de lister les événements (points de trace).

Tapez la commande suivante et appuyez sur Entrée :

trace-cmd list -e

Cette commande affichera une longue liste de points de trace, montrant leur sous-système et leur nom, suivis de leur état actuel entre crochets ([enabled] ou [disabled]).

Vous verrez une sortie similaire à celle-ci (encore une fois, la liste exacte variera) :

  block:block_bio_backmerge [disabled]
  block:block_bio_bounce [disabled]
  block:block_bio_complete [disabled]
  block:block_bio_frontmerge [disabled]
  block:block_bio_queue [disabled]
  block:block_bio_remap [disabled]
  block:block_dirty_buffer [disabled]
  block:block_getrq [disabled]
  block:block_plug [disabled]
  block:block_rq_complete [disabled]
  block:block_rq_insert [disabled]
  block:block_rq_issue [disabled]
  block:block_rq_remap [disabled]
  block:block_rq_requeue [disabled]
  block:block_sync_buffer [disabled]
  block:block_touch_buffer [disabled]
  block:block_unplug [disabled]
  bpf:bpf_trace_printk [disabled]
  bpf:bpf_trace_vprintk [disabled]
  ... (beaucoup d'autres points de trace)

Comme vous pouvez le voir, la plupart des points de trace sont désactivés par défaut pour éviter une surcharge de performance. Vous activeriez généralement des points de trace spécifiques lorsque vous avez besoin de suivre des événements particuliers du noyau.

L'utilisation de trace-cmd list -e est un moyen pratique de voir la liste complète des points de trace et leur état actuel sans avoir à naviguer manuellement dans le système de fichiers /sys/kernel/debug/tracing.

Cliquez sur Continuer pour passer à l'étape suivante.

Vérifier les points de trace (tracepoints) dans /proc/kallsyms

Dans les étapes précédentes, nous avons appris à lister les points de trace en utilisant le système de fichiers de suivi (tracing filesystem) et l'utilitaire trace-cmd. Maintenant, explorons une autre façon de voir les informations sur les points de trace : le fichier /proc/kallsyms.

Le fichier /proc/kallsyms contient les adresses et les noms de tous les symboles du noyau exportés, y compris les fonctions et les variables. Les points de trace sont également représentés comme des symboles dans ce fichier.

Vous pouvez utiliser des commandes telles que cat et grep pour rechercher des symboles de points de trace dans /proc/kallsyms. Les symboles de points de trace suivent généralement une convention de nommage, souvent incluant tracepoint ou _tracepoint.

Essayons de trouver des symboles liés aux points de trace dans /proc/kallsyms. Nous utiliserons cat pour lire le fichier et rediriger la sortie vers grep pour rechercher les lignes contenant le mot "tracepoint".

Tapez la commande suivante et appuyez sur Entrée :

cat /proc/kallsyms | grep tracepoint

Cette commande affichera les lignes de /proc/kallsyms qui contiennent la chaîne de caractères "tracepoint". Vous verrez une sortie similaire à celle-ci :

...
ffffffffXXXXXXXX R __tracepoint_module_load
ffffffffXXXXXXXX R __tracepoint_module_free
ffffffffXXXXXXXX R __tracepoint_module_get
ffffffffXXXXXXXX R __tracepoint_module_put
ffffffffXXXXXXXX R __tracepoint_module_request_module
ffffffffXXXXXXXX R __tracepoint_module_module_init
ffffffffXXXXXXXX R __tracepoint_module_module_exit
ffffffffXXXXXXXX R __tracepoint_module_module_request
ffffffffXXXXXXXX R __tracepoint_module_module_autoload
ffffffffXXXXXXXX R __tracepoint_module_module_kset_reg
ffffffffXXXXXXXX R __tracepoint_module_module_kset_unreg
...

Le XXXXXXXX représente des adresses hexadécimales, qui seront différentes sur votre système. La partie importante est le nom du symbole, qui commence souvent par __tracepoint_ suivi du nom du sous-système et de l'événement.

Cela confirme que les points de trace sont effectivement représentés comme des symboles dans la table des symboles du noyau, accessible via /proc/kallsyms. Bien que /sys/kernel/debug/tracing et trace-cmd offrent une interface plus conviviale pour gérer et afficher les points de trace, comprendre qu'ils existent sous forme de symboles du noyau est fondamental pour les concepts avancés de suivi du noyau.

Vous avez maintenant appris trois façons différentes d'identifier et d'inspecter les points de trace sur un système Linux.

Cliquez sur Continuer pour terminer ce laboratoire.

Résumé

Dans ce laboratoire, nous avons commencé par explorer les points de trace (tracepoints) Linux, qui sont essentiels pour le débogage du noyau et l'analyse des performances. Nous avons appris que le répertoire /sys/kernel/debug/tracing permet d'accéder au cadre de suivi (tracing framework) du noyau. Plus précisément, nous avons utilisé la commande ls /sys/kernel/debug/tracing/events pour lister les points de trace disponibles, qui sont organisés par sous-système du noyau dans le répertoire events. Cette première étape a montré comment identifier les différents événements du noyau qui peuvent être suivis sur un système.