Red Hat Training

A Red Hat training course is available for RHEL 8

第 36 章 使用 BPF Compiler Collection 分析系统性能

作为系统管理员,您可以使用 BPF Compiler Collection(BCC)库创建用于分析 Linux 操作系统性能和收集信息的工具,这些信息可能难以通过其他接口获得。

36.1. BCC 介绍

BPF Compiler Collection(BCC)是一个库,可帮助创建扩展的 Berkeley Packet Filter(eBPF)程序。eBPF 程序的主要工具是在不需要额外的开销或存在安全问题的情况下,分析操作系统性能和网络性能。

BCC 不再需要用户了解 eBPF 的技术详情,并提供了许多开箱即用的起点,如预先创建的 eBPF 程序的 bcc-tools 软件包。

注意

eBPF 程序在事件中触发,如磁盘 I/O、TCP 连接以及进程创建。程序不太可能导致内核崩溃、循环或者变得无响应,因为它们在内核的安全性虚拟机中运行。

36.2. 安装 bcc-tools 软件包

本节论述了如何安装 bcc-tools 软件包,该软件包还会将 BPF Compiler Collection(BCC)库作为依赖性安装。

先决条件

流程

  1. 安装 bcc-tools:

    # yum install bcc-tools

    BCC 工具安装在 /usr/share/bcc/tools/ 目录中。

  2. (可选)检查工具:

    # ll /usr/share/bcc/tools/
    ...
    -rwxr-xr-x. 1 root root  4198 Dec 14 17:53 dcsnoop
    -rwxr-xr-x. 1 root root  3931 Dec 14 17:53 dcstat
    -rwxr-xr-x. 1 root root 20040 Dec 14 17:53 deadlock_detector
    -rw-r--r--. 1 root root  7105 Dec 14 17:53 deadlock_detector.c
    drwxr-xr-x. 3 root root  8192 Mar 11 10:28 doc
    -rwxr-xr-x. 1 root root  7588 Dec 14 17:53 execsnoop
    -rwxr-xr-x. 1 root root  6373 Dec 14 17:53 ext4dist
    -rwxr-xr-x. 1 root root 10401 Dec 14 17:53 ext4slower
    ...

    上表中的 doc 目录包括了每个工具的文档。

36.3. 使用所选 bcc-tools 进行性能调整

这部分论述了如何使用 BPF Compiler Collection(BCC)库中某些预先创建的程序来高效且安全地分析每个事件的系统性能。BCC 库中预创建的程序集可作为创建其他程序的示例。

先决条件

使用 execsnoop 检查系统进程

  1. 在一个终端中执行 execsnoop 程序:

    # /usr/share/bcc/tools/execsnoop
  2. 在另一个终端执行中,例如:

    $ ls /usr/share/bcc/tools/doc/

    以上会为 ls 命令创建了一个简短运行的进程。

  3. 终端运行 execsnoop 显示类似如下的输出:

    PCOMM	PID    PPID   RET ARGS
    ls   	8382   8287     0 /usr/bin/ls --color=auto /usr/share/bcc/tools/doc/
    sed 	8385   8383     0 /usr/bin/sed s/^ *[0-9]\+ *//
    ...

    execsnoop 程序为每个消耗系统资源的新进程输出一行。它甚至会检测很快运行的程序(如 ls )的进程,大多数监控工具都不会注册它们。

    execsnoop 输出显示以下字段:

    • PCOMM - 父进程名称。(ls)
    • PID - 进程 ID。(8382)
    • PPID - 上级进程 ID。(8287)
    • RET - exec() 系统调用(0)的返回值,它会将程序代码加载到新进程中。
    • ARGS - 使用参数启动的程序的位置。

要查看 execsnoop 的详情、示例和选项,请参阅 /usr/share/bcc/tools/doc/execsnoop_example.txt 文件。

有关 exec() 的详情请参考 exec(3) 手册页。

使用 opensnoop 跟踪命令打开的文件

  1. 在一个终端中执行 opensnoop 程序:

    # /usr/share/bcc/tools/opensnoop -n uname

    以上列出了文件的输出结果,这些文件只由 uname 命令的进程打开。

  2. 在另一个终端中执行:

    $ uname

    以上命令会打开某些在下一步中捕获的文件。

  3. 终端运行 opensnoop 显示类似如下的输出:

    PID    COMM 	FD ERR PATH
    8596   uname 	3  0   /etc/ld.so.cache
    8596   uname 	3  0   /lib64/libc.so.6
    8596   uname 	3  0   /usr/lib/locale/locale-archive
    ...

    opensnoop 程序监视整个系统的 open() 系统调用,并为每个 uname 试图按方法打开的文件输出一行。

    opensnoop 输出显示以下字段:

    • PID - 进程 ID。(8596)
    • COMM - 进程名称。(uname)
    • FD - 文件描述符 - open() 返回引用打开文件的值。(3)
    • ERR - 任何错误。
    • PATH - open() 试图打开的文件位置。

      如果命令尝试读取不存在的文件,则 FD 列返回 -1ERR 列显示与相关错误对应的值。因此,opensnoop 可以帮助您识别行为不正确的应用程序。

要查看 opensnoop 的详情、示例和选项,请参阅 /usr/share/bcc/tools/doc/opensnoop_example.txt 文件。

有关 open() 的详情请参考 open(2) 手册页。

使用技术检查磁盘上的 I/O 操作

  1. 在一个终端中执行 biotop 程序:

    # /usr/share/bcc/tools/biotop 30

    该命令可让您监控在磁盘中执行 I/O 操作的主要进程。参数确保命令生成 30 秒概述。

    注意

    如果未提供任何参数,则默认情况下输出屏幕会每 1 秒刷新一次。

  2. 在另一个终端中执行,例如:

    # dd if=/dev/vda of=/dev/zero

    以上命令从本地硬盘设备中读取内容,并将输出写入 /dev/zero 文件中。此步骤生成特定的 I/O 流量来演示 biotop

  3. 终端运行 biotop 显示类似如下的输出:

    PID    COMM             D MAJ MIN DISK       I/O  Kbytes     AVGms
    9568   dd               R 252 0   vda      16294 14440636.0  3.69
    48     kswapd0          W 252 0   vda       1763 120696.0    1.65
    7571   gnome-shell      R 252 0   vda        834 83612.0     0.33
    1891   gnome-shell      R 252 0   vda       1379 19792.0     0.15
    7515   Xorg             R 252 0   vda        280  9940.0     0.28
    7579   llvmpipe-1       R 252 0   vda        228  6928.0     0.19
    9515   gnome-control-c  R 252 0   vda         62  6444.0     0.43
    8112   gnome-terminal-  R 252 0   vda         67  2572.0     1.54
    7807   gnome-software   R 252 0   vda         31  2336.0     0.73
    9578   awk              R 252 0   vda         17  2228.0     0.66
    7578   llvmpipe-0       R 252 0   vda        156  2204.0     0.07
    9581   pgrep            R 252 0   vda         58  1748.0     0.42
    7531   InputThread      R 252 0   vda         30  1200.0     0.48
    7504   gdbus            R 252 0   vda          3  1164.0     0.30
    1983   llvmpipe-1       R 252 0   vda         39   724.0     0.08
    1982   llvmpipe-0       R 252 0   vda         36   652.0     0.06
    ...

    biotop 输出显示以下字段:

    • PID - 进程 ID。(9568)
    • COMM - 进程名称。(dd)
    • DISK - 执行读取操作的磁盘。(vda)
    • I/O - 执行读取操作的数量。(16294)
    • Kbytes - 读操作达到的 K 字节。(14,440,636)
    • AVGms - 读操作的平均 I/O 时间。(3.69)

要查看 biotop 的详情、示例和选项,请参阅 /usr/share/bcc/tools/doc/biotop_example.txt 文件。

有关 dd 的详情请参考 dd(1) 手册页。

使用 xfsslower 来公开意料外的慢文件系统操作

  1. 在一个终端中执行 xfsslower 程序:

    # /usr/share/bcc/tools/xfsslower 1

    以上命令测量 XFS 文件系统执行读取、写入、打开或同步(fsync)操作的时间。1 参数确保程序只显示比 1 ms 慢的操作。

    注意

    如果没有提供参数,xfsslower 默认会显示比 10 ms 慢的操作。

  2. 在另一个终端中执行,例如:

    $ vim text

    以上命令在 vim 编辑器中创建了一个文本文件,用于启动与 XFS 文件系统的某些互动。

  3. 运行 xfsslower 的终端显示在保存上一步中的文件时:

    TIME     COMM           PID    T BYTES   OFF_KB   LAT(ms) FILENAME
    13:07:14 b'bash'        4754   R 256     0           7.11 b'vim'
    13:07:14 b'vim'         4754   R 832     0           4.03 b'libgpm.so.2.1.0'
    13:07:14 b'vim'         4754   R 32      20          1.04 b'libgpm.so.2.1.0'
    13:07:14 b'vim'         4754   R 1982    0           2.30 b'vimrc'
    13:07:14 b'vim'         4754   R 1393    0           2.52 b'getscriptPlugin.vim'
    13:07:45 b'vim'         4754   S 0       0           6.71 b'text'
    13:07:45 b'pool'        2588   R 16      0           5.58 b'text'
    ...

    上面的每一行代表文件系统中的一个操作,其用时超过特定阈值。xfsslower 对于公开可能的文件系统问题非常有用,这些问题可能会意外地减慢操作速度。

    xfsslower 输出显示以下字段:

    • COMM - 进程名称。(b’bash')
    • T - 操作类型。R

      • Read
      • Write
      • Sync
    • OFF_KB - KB 中的文件偏移。(0)
    • FILENAME - 被读取、写入或者同步的文件。

要查看 xfsslower 的详情、示例和选项,请参阅 /usr/share/bcc/tools/doc/xfsslower_example.txt 文件。

有关 fsync 的详情请参考 fsync(2) 手册页。