如何检查 Linux 内核性能计数器是否激活

LinuxLinuxBeginner
立即练习

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

简介

在这个实验中,你将学习如何检查 Linux 中内核性能计数器 (kernel performance counters) 是否处于活动状态。你将探索如何使用 perf stat 命令来测量命令执行的性能计数器,验证 /sys/kernel 文件系统内的性能计数器配置,并使用 dmesg 检查内核日志中与性能计数器相关的消息。通过这个实践经验,你将掌握诊断和了解 Linux 系统上性能监控状态的技能。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) linux/BasicSystemCommandsGroup -.-> linux/sleep("Execution Delaying") linux/BasicFileOperationsGroup -.-> linux/ls("Content Listing") linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/FileandDirectoryManagementGroup -.-> linux/cd("Directory Changing") linux/TextProcessingGroup -.-> linux/grep("Pattern Searching") subgraph Lab Skills linux/sleep -.-> lab-558797{{"如何检查 Linux 内核性能计数器是否激活"}} linux/ls -.-> lab-558797{{"如何检查 Linux 内核性能计数器是否激活"}} linux/cat -.-> lab-558797{{"如何检查 Linux 内核性能计数器是否激活"}} linux/cd -.-> lab-558797{{"如何检查 Linux 内核性能计数器是否激活"}} linux/grep -.-> lab-558797{{"如何检查 Linux 内核性能计数器是否激活"}} end

使用 perf stat 检查计数器

在这一步中,你将学习如何使用 perf stat 命令来测量性能计数器。性能计数器是特殊的硬件寄存器,用于统计 CPU 内发生的特定事件,例如执行的指令数量、缓存未命中次数或分支预测情况。

perf 工具是 Linux 中用于性能分析的强大命令行实用程序。perf stat 用于运行一个命令,并收集该命令执行过程中的性能计数器统计信息。

让我们从运行一个简单的命令并观察其性能计数器开始。我们将使用 ls 命令,该命令用于列出目录内容。

如果你还没有打开终端,请打开它。你可以在桌面左侧找到 Xfce Terminal 图标。

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

perf stat ls

你应该会看到类似于以下的输出:

 Performance counter stats for 'ls':

          <placeholder>      task-clock (msec)         ##    <placeholder> CPUs utilized
          <placeholder>      context-switches          ##    <placeholder> /sec
          <placeholder>      cpu-migrations            ##    <placeholder> /sec
          <placeholder>      page-faults               ##    <placeholder> /sec
          <placeholder>      cycles                    ##    <placeholder> GHz
          <placeholder>      instructions              ##    <placeholder>  insns per cycle
          <placeholder>      branches                  ##    <placeholder> % of all instructions
          <placeholder>      branch-misses             ##    <placeholder> % of all branches

          <placeholder> msec task-clock                ##    <placeholder> CPUs utilized

具体的数字和事件可能会因系统和具体执行情况而异,但你应该会看到在执行 ls 命令期间的一系列性能事件及其计数。

你可能会看到的一些常见事件包括:

  • task-clock:任务在 CPU 上运行的总时间。
  • cycles:花费的 CPU 周期数。
  • instructions:执行的指令数量。
  • branch-misses:分支预测错误的次数。

理解这些计数器可以帮助你识别代码或系统中的性能瓶颈。

你还可以对更复杂的命令甚至脚本运行 perf stat 来分析其性能。

例如,让我们尝试对一个简单的 sleep 命令运行 perf stat

perf stat sleep 1

这将在系统休眠 1 秒时测量性能计数器。输出将显示 sleep 进程的计数器。

尝试对不同的命令运行 perf stat,看看计数器如何变化。

点击 Continue 进入下一步。

验证 /sys/kernel 中的计数器配置

在这一步中,你将探索 Linux 内核的 /sys 文件系统是如何展示性能计数器配置的。/sys 文件系统提供了一个访问内核数据结构的接口,允许你查看,有时还能修改内核参数。

性能计数器的设置,例如非特权用户是否可以访问原始性能计数器事件,通常是通过 /sys/kernel/perf_event 目录下的文件来控制的。

让我们导航到相关目录并查看一个配置文件。

首先,使用 cd 命令将当前目录更改为 /sys/kernel/perf_event。记住,你的默认目录是 ~/project,所以你需要使用绝对路径。

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

cd /sys/kernel/perf_event

现在你已进入 /sys/kernel/perf_event 目录。你可以使用 ls 命令查看该目录下的文件:

ls

你应该会看到一个文件列表,可能包括:

kptr_restrict  perf_event_paranoid  sysfs_deprecated

我们感兴趣的文件是 perf_event_paranoid。这个文件控制着非特权用户对性能事件的访问级别。数值越低表示限制越少(访问权限越高),数值越高表示限制越多(访问权限越低)。

让我们使用 cat 命令查看这个文件的内容:

cat perf_event_paranoid

输出将是一个单独的数字,通常在 -1 到 2 之间。

<number>

以下是不同数值的一般含义:

  • -1:允许所有用户使用所有 perf 功能。
  • 0:允许所有用户使用 perf 进行进程级和 CPU 级的测量。
  • 1:仅允许特权用户(如 root)使用 perf 进行进程级和 CPU 级的测量。
  • 2:仅允许特权用户使用 perf 进行进程级的测量。

出于安全考虑,默认值通常为 2,以防止非特权用户可能利用性能计数器获取其他进程的信息。

了解这个文件有助于你了解系统在性能监控访问方面的配置情况。

点击 Continue 继续。

在 dmesg 中查看计数器日志

在这一步中,你将学习如何使用 dmesg 命令查看内核消息,这些消息有时可能包含与性能计数器或 perf 事件相关的信息。dmesg 是一个用于显示内核环形缓冲区消息的命令。这些消息是内核在启动和运行期间生成的,包含对调试和系统分析有价值的信息。

虽然 perf 本身通常会直接将统计信息输出到终端,但内核与性能监控硬件的交互或任何相关问题可能会记录在内核环形缓冲区中。

要查看内核消息,请使用 dmesg 命令:

dmesg

这可能会在你的终端上输出大量内容,显示内核环形缓冲区中的所有消息。

要查找与 perf 或性能计数器特别相关的消息,你可以将 dmesg 的输出通过管道传递给 grep 命令。grep 是一个使用模式搜索文本的强大工具。

让我们搜索包含“perf”这个词的消息:

dmesg | grep perf

这个命令的作用如下:

  • dmesg:输出内核消息。
  • |:这是一个管道符号,它将左边命令的输出作为输入传递给右边的命令。
  • grep perf:在输入中搜索包含“perf”这个词的行。

你可能会看到类似以下的输出(或者根据最近的内核事件,可能什么都看不到):

[<placeholder>] perf: interrupt took too long (<placeholder> > <placeholder> ms), lowering kernel.perf_event_paranoid to <placeholder>

这个示例消息表明性能中断花费的时间过长,内核自动将 perf_event_paranoid 设置(我们在上一步中看到过)调整为限制较少的值,以可能缓解这个问题。

你还可以搜索其他相关术语,如“performance”或“counter”:

dmesg | grep performance
dmesg | grep counter

查看 dmesg 的输出有助于诊断与性能监控相关的问题,或者了解内核如何与性能计数器硬件进行交互。

点击 Continue 完成本次实验。

总结

在本次实验中,你学习了如何检查 Linux 内核性能计数器是否处于激活状态。你首先使用 perf stat 命令为像 ls 这样的简单命令测量性能计数器,观察各种性能事件的输出及其计数。这展示了 perf 工具在性能分析方面的基本功能。

接着,实验引导你验证 /sys/kernel 文件系统中的性能计数器配置,并在 dmesg 输出中查看与计数器相关的日志。这些步骤提供了确认系统对内核性能计数器的支持和激活状态的方法,除了 perf stat 命令之外,还提供了评估其可用性的其他途径。