使用 perf 进行性能分析

性能在任何计算机程序中都起着重要作用。 这是使用户留在您的软件的东西。 想象一下,如果您的软件即使在功能强大的机器上也需要几分钟才能启动。 或者想象它在做一些重要工作时表现出明显的性能下降。 这两种情况都会严重影响您的应用程序。 操作系统内核对性能更为关键,因为如果它滞后,整个系统就会滞后。 编写提供最高性能的代码是开发人员的责任。

要编写提供良好性能的程序,我们应该知道程序的哪一部分正在成为瓶颈。 这样,我们就可以集中精力优化代码的那个区域。 有很多工具可以帮助您作为开发人员分析您的程序,并更好地了解您的代码的哪一部分需要注意。 本文讨论了帮助您在 Linux 上分析程序的工具之一。

介绍性能

Linux 中的 perf 命令使您可以访问集成到 Linux 内核中的各种工具。 这些工具可以帮助您收集和分析有关您的程序或系统的性能数据。 perf profiler 快速、轻便且精确。

要使用 perf 命令,需要在您的发行版上安装 perf 软件包。 您可以使用以下命令安装它:

sudo dnf install perf

安装所需的软件包后,启动终端并执行 perf 命令。 您将看到类似于以下的输出:

perf 命令提供了许多可用于分析代码的选项。 让我们来看看一些可以经常帮助我们的命令。

列出事件

性能列表

list 命令显示可以由 perf 命令跟踪的事件列表。 输出将如下所示:

有很多事件可以通过 perf 命令跟踪。 从广义上讲,这些事件可以是软件事件,例如上下文切换或页面错误,也可以是源自处理器本身的硬件事件,例如 L1 高速缓存未命中或时钟周期数。

使用 perf stat 计数事件

perf stat 命令可用于统计与特定进程或命令相关的事件。 让我们通过运行以下命令来查看此用法的示例:

perf stat -B dd if=/dev/urandom of=/dev/null count=50k

该命令的输出列出了与在执行上述命令期间发生的不同类型事件相关的计数器。

要获取系统上所有内核的系统范围统计信息,请运行以下命令:

性能统计 -a

该命令收集并报告收集到的所有事件统计信息,直到您按 Ctrl+C。

stat 命令使您可以选择仅选择特定事件进行报告。 要选择事件,请运行带有 -e 选项的 stat 命令,后跟以逗号分隔的要报告的事件列表。 为了 example:

perf stat -e cycles,page-faults -a

此命令提供有关系统上所有内核的名为循环和页面错误的事件的统计信息。

要获取特定进程的统计信息,请运行以下命令,其中 PID 是您希望获得性能统计信息的进程的进程 ID:

perf stat -p <PID>

使用性能记录进行采样

perf record 命令用于将事件数据采样到文件中。 该命令在每线程模式下运行,默认情况下记录循环事件的数据。 为了 example,要收集所有 CPU 的系统范围数据,请执行以下命令:

性能记录 -a

记录会收集样本数据,直到您按下 Ctrl+C。 默认情况下,该数据存储在名为 perf.data 的文件中。 要将数据存储在其他文件中,请使用 -o 选项将文件名传递给命令。 要查看记录的数据,请运行以下命令:

性能报告

此命令产生类似于以下内容的输出:

性能记录

该报告包含 4 列,它们具有各自的特定含义:

  1. 开销:在相应函数中收集的总体样本的百分比
  2. 命令:样本所属的命令
  3. 共享对象:样本来自的图像的名称
  4. 符号:构成样本的符号名称,以及获取样本的特权级别。 有 5 个权限级别: [.] 用户级别, [k] 内核级别, [g] 来宾内核级别(虚拟化), [u] 来宾操作系统用户空间,以及 [H] 管理程序。

该命令可帮助您显示最昂贵的功能。 然后,您可以专注于这些功能以进一步优化它们。

寻找要优化的代码

为了 example,让我们检查一个 firefox 处理,并为它采样数据。 在这个 example, 这 firefox 进程作为 PID 2750 运行。

firefox  记录

执行 perf report 命令会产生一个像这样的屏幕,按开销的降序列出各种符号:

性能报告 firefox

有了这些数据,我们就可以确定在我们的代码中产生最高开销的函数。 现在我们可以开始我们的旅程来优化它们的性能。

这是使用 perf 对程序和系统进行性能分析的简要介绍。 perf 命令有许多其他选项,可让您在系统上运行基准测试以及注释代码。 有关 perf 命令的更多信息,请访问 性能维基.

图片礼貌 哈尼·贾杰最初发布到 不飞溅 作为 无标题.