Red Hat Training

A Red Hat training course is available for RHEL 8

第 34 章 SystemTap 入门

作为系统管理员,您可以使用 SystemTap 识别运行 Linux 系统上出现错误或性能问题的底层原因。

作为应用开发人员,您可以使用 SystemTap 详细监控应用程序在 Linux 系统中的行为。

34.1. SystemTap 的目的

SystemTap 是一款跟踪和探测工具,可用于详细研究和监控操作系统(特别是内核)的活动。SystemTap 提供的信息类似于 netstatpstopiostat 等工具的输出。但是,SystemTap 为收集的信息提供更多过滤和分析选项。在 SystemTap 脚本中,您可以指定 SystemTap 收集的信息。

SystemTap 旨在通过为用户提供相应的基础架构来跟踪内核活动并将此功能与两个属性相结合,以此补充现有的 Linux 监控工具套件:

灵活性
SystemTap 框架允许您开发用于调查和监控内核空间中各种内核功能、系统调用和其他事件的简单脚本。因此,SystemTap 不再只是一个工具,它是一个可让您开发特定于内核的取证和监控工具的系统。
易于使用
SystemTap 允许您监控内核活动,而无需重新编译内核或重新引导系统。

34.2. Installing SystemTap

要开始使用 SystemTap,请安装必要的软件包。要在多个系统安装了多个内核的内核中使用 SystemTap,请为每个内核版本安装对应的内核软件包

先决条件

流程

  1. 安装所需的 SystemTap 软件包:

    # yum install systemtap
  2. 安装所需的内核软件包:

    1. 使用 stap-prep:

      # stap-prep
    2. 如果 stap-prep 无法工作,请手动安装所需的内核软件包:

      # yum install kernel-debuginfo-$(uname -r) kernel-debuginfo-common-$(uname -i)-$(uname -r) kernel-devel-$(uname -r)

      $(uname -i) 会自动替换为系统的硬件平台,$(uname -r) 会自动替换为正在运行的内核版本。

验证步骤

  • 如果要使用 SystemTap 探测的内核当前正在使用,测试您的安装是否成功:

    # stap -v -e 'probe kernel.function("vfs_read") {printf("read performed\n"); exit()}'

    成功部署 SystemTap 时会出现类似如下的输出:

    Pass 1: parsed user script and 45 library script(s) in 340usr/0sys/358real ms.
    Pass 2: analyzed script: 1 probe(s), 1 function(s), 0 embed(s), 0 global(s) in 290usr/260sys/568real ms.
    Pass 3: translated to C into "/tmp/stapiArgLX/stap_e5886fa50499994e6a87aacdc43cd392_399.c" in 490usr/430sys/938real ms.
    Pass 4: compiled C into "stap_e5886fa50499994e6a87aacdc43cd392_399.ko" in 3310usr/430sys/3714real ms.
    Pass 5: starting run. 1
    read performed 2
    Pass 5: run completed in 10usr/40sys/73real ms. 3

    输出的最后三行(使用 Pass 5的示例)表示:

    1
    SystemTap 成功创建了探测内核并运行检测的工具。
    2
    SystemTap 检测到指定的事件(本例中为 A VFS 读取)。
    3
    SystemTap 执行了一个有效的处理程序(打印文本,然后在不出现错误的情况下将其关闭)。

34.3. 运行 SystemTap 的特权

运行 SystemTap 脚本需要升级的系统特权,但在某些情况下,非特权用户可能需要在其计算机上运行 SystemTap 检测。

要允许用户在没有 root 访问权限的情况下运行 SystemTap,请将用户添加到这两个用户组中

stapdev

这个组的成员可以使用 stap 运行 SystemTap 脚本,或者 staprun 运行 SystemTap 检测模块。

运行 stap 涉及将 SystemTap 脚本编译到内核模块中,并将它们加载到内核中。这需要提高系统的权限,系统会授予 stapdev 成员的权限。不幸的是,这些权限也授予 stapdev 成员的有效 root 访问权限。因此,只为可信任 root 访问权限的用户授予 stapdev 组成员资格。

stapusr
这个组的成员只能使用 staprun 运行 SystemTap 检测模块。另外,他们只能从 /lib/modules/kernel_version/systemtap/ 目录中运行这些模块。该目录只能归 root 用户所有,并且只能由 root 用户写入。

34.4. 运行 SystemTap 脚本

您可以从标准输入或文件运行 SystemTap 脚本。

/usr/share/systemtap/examples 目录中可以找到随 SystemTap 安装一起分发的示例脚本。

先决条件

  1. SystemTap 和相关所需的内核软件包安装如安装 Systemtap 中所述
  2. 要以普通用户身份运行 SystemTap 脚本,请将用户添加到 SystemTap 组:

    # usermod --append --groups
    stapdev,stapusr user-name

流程

  • 运行 SystemTap 脚本:

    • 从标准输入中输入:

      # echo "probe timer.s(1) {exit()}" | stap -

      这个命令指示 stap 运行 echo 传递给标准输入的脚本。要添加 stap 选项,在 - 字符前面插入它们。例如,要使这个命令的结果更加详细,该命令为:

      # echo "probe timer.s(1) {exit()}" | stap -v -
    • 在一个文件中:

      # stap file_name