如何检查 Linux 内核跟踪点是否处于活动状态

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本次实验中,你将探索如何检查 Linux 内核跟踪点(tracepoint)是否处于激活状态。跟踪点对于观察内核事件至关重要,在调试和性能分析方面具有不可估量的价值。首先,你将使用 /sys/kernel/debug/tracing 文件系统列出系统中可用的跟踪点。

在初步探索之后,你将学习如何使用 trace-cmd 工具检查特定跟踪点的状态,最后通过查看 /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{{"如何检查 Linux 内核跟踪点是否处于活动状态"}} linux/cat -.-> lab-558726{{"如何检查 Linux 内核跟踪点是否处于活动状态"}} linux/grep -.-> lab-558726{{"如何检查 Linux 内核跟踪点是否处于活动状态"}} linux/apt -.-> lab-558726{{"如何检查 Linux 内核跟踪点是否处于活动状态"}} end

使用 ls /sys/kernel/debug/tracing 列出跟踪点

在这一步中,你将开始探索 Linux 跟踪点(tracepoint)。跟踪点是置于内核源代码中的钩子,可让你观察内核内部发生的特定事件。它们在调试和性能分析方面非常有价值。

Linux 内核提供了一个跟踪框架,通常可以通过 /sys/kernel/debug/tracing 目录进行访问。该目录包含各种用于控制跟踪并提供跟踪信息的文件。

要查看系统中可用的跟踪点,你可以列出跟踪文件系统中 events 目录的内容。

如果终端尚未打开,请打开它。记住,你可以在桌面左侧找到 Xfce 终端 图标。

现在,输入以下命令并按回车键:

ls /sys/kernel/debug/tracing/events

此命令使用 ls 列出 /sys/kernel/debug/tracing/events 目录的内容。events 目录是内核公开可用跟踪点的地方,这些跟踪点按子系统进行组织。

你会看到一个目录列表,每个目录代表一个内核子系统(如 syscallsschedext4 等)。这些目录中包含实际的跟踪点名称。

例如,你可能会看到类似以下的输出(确切的输出会因内核版本和配置而异):

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 目录列出了可用的跟踪点(tracepoint)。现在,你将使用 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 列出事件(跟踪点)。

输入以下命令并按回车键:

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 工具列出跟踪点(tracepoint)。现在,你将探索另一种查看跟踪点信息的方法:通过 /proc/kallsyms 文件。

/proc/kallsyms 文件包含所有导出的内核符号(包括函数和变量)的地址和名称。跟踪点在这个文件中也以符号的形式表示。

你可以使用 catgrep 等命令在 /proc/kallsyms 中搜索跟踪点符号。跟踪点符号通常遵循一定的命名约定,常常包含 tracepoint_tracepoint

让我们尝试在 /proc/kallsyms 中查找与跟踪点相关的符号。你将使用 cat 读取文件,并将输出通过管道传递给 grep,以搜索包含 "tracepoint" 这个词的行。

输入以下命令并按回车键:

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/tracingtrace-cmd 为管理和查看跟踪点提供了更用户友好的界面,但理解它们作为内核符号存在是高级内核跟踪概念的基础。

你现在已经学习了三种在 Linux 系统上识别和检查跟踪点的不同方法。

点击 继续 完成此实验。

总结

在本实验中,你首先探索了 Linux 跟踪点(tracepoint),它对于内核调试和性能分析至关重要。你了解到 /sys/kernel/debug/tracing 目录提供了对内核跟踪框架的访问。具体来说,你使用了 ls /sys/kernel/debug/tracing/events 命令来列出可用的跟踪点,这些跟踪点在 events 目录中按内核子系统进行组织。这第一步展示了如何识别系统上可以跟踪的各种内核事件。