Как проверить, активна ли трассировочная точка ядра в Linux

LinuxLinuxBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном занятии мы рассмотрим, как проверить, активен ли трассировочный точка ядра (kernel tracepoint) в Linux. Трассировочные точки (tracepoints) являются важными инструментами для наблюдения за событиями ядра и неоценимы при отладке и анализе производительности. Мы начнем с перечисления доступных трассировочных точек на вашей системе с использованием файловой системы /sys/kernel/debug/tracing.

После этого мы узнаем, как проверить статус конкретных трассировочных точек с помощью утилиты trace-cmd и, наконец, проверим трассировочные точки, изучив файл /proc/kallsyms.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux(("Linux")) -.-> linux/PackagesandSoftwaresGroup(["Packages and Softwares"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) 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{{"Как проверить, активна ли трассировочная точка ядра в Linux"}} linux/cat -.-> lab-558726{{"Как проверить, активна ли трассировочная точка ядра в Linux"}} linux/grep -.-> lab-558726{{"Как проверить, активна ли трассировочная точка ядра в Linux"}} linux/apt -.-> lab-558726{{"Как проверить, активна ли трассировочная точка ядра в Linux"}} end

Перечисление трассировочных точек с помощью команды ls /sys/kernel/debug/tracing

На этом этапе мы начнем изучать трассировочные точки (tracepoints) в Linux. Трассировочные точки - это точки вставки в исходный код ядра, которые позволяют наблюдать за конкретными событиями, происходящими внутри ядра. Они неоценимы для отладки и анализа производительности.

Ядро Linux предоставляет фреймворк для трассировки, который обычно доступен через каталог /sys/kernel/debug/tracing. В этом каталоге находятся различные файлы, которые управляют трассировкой и предоставляют информацию о ней.

Чтобы увидеть доступные трассировочные точки на вашей системе, вы можете перечислить содержимое каталога events в файловой системе трассировки.

Если терминал еще не открыт, откройте его. Помните, что вы можете найти значок Xfce Terminal слева на рабочем столе.

Теперь введите следующую команду и нажмите Enter:

ls /sys/kernel/debug/tracing/events

Эта команда использует ls для перечисления содержимого каталога /sys/kernel/debug/tracing/events. Каталог events - это место, где ядро предоставляет доступ к доступным трассировочным точкам, организованным по подсистемам.

Вы увидите список каталогов, каждый из которых представляет подсистему ядра (например, syscalls, sched, ext4 и т.д.). Внутри этих каталогов находятся имена фактических трассировочных точек.

Например, вы можете увидеть вывод, похожий на следующий (точный вывод будет различаться в зависимости от версии ядра и его конфигурации):

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/

Этот вывод показывает различные категории событий, которые вы можете отслеживать. На следующих шагах мы узнаем, как проверить статус этих трассировочных точек.

Нажмите Продолжить, чтобы продолжить.

Проверка статуса трассировочных точек с помощью trace-cmd

На предыдущем этапе мы перечислили доступные трассировочные точки, исследуя каталог /sys/kernel/debug/tracing/events. Теперь давайте используем утилиту trace-cmd для получения более подробной информации о трассировочных точках, а именно о их статусе (включены они или отключены).

Команда trace-cmd представляет собой мощный инструмент для взаимодействия с фреймворком трассировки Linux. Если trace-cmd еще не установлен, вы можете установить его с помощью apt.

Сначала обновите список пакетов:

sudo apt update

Затем установите trace-cmd:

sudo apt install trace-cmd

Возможно, вы увидите сообщение о том, что trace-cmd уже установлен, что является нормальным.

Теперь, чтобы перечислить все доступные трассировочные точки и их статус, используйте команду trace-cmd list -e. Опция -e сообщает trace-cmd перечислить события (трассировочные точки).

Введите следующую команду и нажмите Enter:

trace-cmd list -e

Эта команда выведет длинный список трассировочных точек, показывая их подсистему и имя, а затем их текущий статус в квадратных скобках ([enabled] или [disabled]).

Вы увидите вывод, похожий на следующий (опять же, точный список будет различаться):

  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]
  ... (many more tracepoints)

Как вы можете видеть, большинство трассировочных точек по умолчанию отключены, чтобы избежать снижения производительности. Обычно вы бы включали конкретные трассировочные точки, когда вам нужно отслеживать определенные события ядра.

Использование trace-cmd list -e является удобным способом просмотра полного списка трассировочных точек и их текущего состояния без ручного навигации по файловой системе /sys/kernel/debug/tracing.

Нажмите Продолжить, чтобы перейти к следующему шагу.

Проверка трассировочных точек в файле /proc/kallsyms

На предыдущих этапах мы узнали, как перечислить трассировочные точки с использованием файловой системы трассировки и утилиты trace-cmd. Теперь давайте рассмотрим другой способ просмотра информации о трассировочных точках: файл /proc/kallsyms.

Файл /proc/kallsyms содержит адреса и имена всех экспортированных символов ядра, включая функции и переменные. Трассировочные точки также представлены в этом файле как символы.

Вы можете использовать команды, такие как cat и grep, чтобы найти символы трассировочных точек в файле /proc/kallsyms. Символы трассировочных точек обычно следуют определенному соглашению об именовании и часто содержат tracepoint или _tracepoint.

Давайте попробуем найти символы, связанные с трассировочными точками, в файле /proc/kallsyms. Мы используем cat для чтения файла и передаем вывод в grep, чтобы найти строки, содержащие слово "tracepoint".

Введите следующую команду и нажмите Enter:

cat /proc/kallsyms | grep tracepoint

Эта команда отобразит строки из файла /proc/kallsyms, содержащие строку "tracepoint". Вы увидите вывод, похожий на следующий:

...
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
...

XXXXXXXX представляет собой шестнадцатеричные адреса, которые будут различными на вашей системе. Важной частью является имя символа, которое часто начинается с __tracepoint_, за которым следуют имя подсистемы и события.

Это подтверждает, что трассировочные точки действительно представлены как символы в таблице символов ядра, доступной через /proc/kallsyms. Хотя /sys/kernel/debug/tracing и trace-cmd предоставляют более удобный интерфейс для управления и просмотра трассировочных точек, понимание того, что они существуют как символы ядра, является фундаментом для более продвинутых концепций трассировки ядра.

Теперь вы узнали три различных способа идентификации и проверки трассировочных точек в системе Linux.

Нажмите Продолжить, чтобы завершить этот практический урок.

Резюме

В этом практическом уроке мы начали с изучения трассировочных точек (tracepoints) Linux, которые являются важными для отладки ядра и анализа производительности. Мы узнали, что каталог /sys/kernel/debug/tracing предоставляет доступ к фреймворку трассировки ядра. В частности, мы использовали команду ls /sys/kernel/debug/tracing/events для перечисления доступных трассировочных точек, которые организованы по подсистемам ядра в каталоге events. Этот первый шаг показал, как определить различные события ядра, которые можно отслеживать в системе.