有没有什么方法可以在 WSL 下运行 perf?

yod*_*aji 15 linux perf windows-subsystem-for-linux

当我想在 WSL 下运行 perf 时,我遇到了以下问题:

警告:找不到内核 4.4.0-18362 的性能

您可能需要为此特定内核安装以下软件包:

linux-tools-4.4.0-18362-Microsoft

linux-cloud-tools-4.4.0-18362-Microsoft

您可能还需要安装以下软件包之一以保持最新状态:

linux-tools-微软

linux-cloud-tools-微软

但我找不到名为linux-tools-4.4.0-18362-Microsoftor 的包linux-cloud-tools-4.4.0-18362-Microsoft。我猜包名是自动生成的。

我还尝试在 docker 容器中使用 perf。但是,docker 容器使用与主机相同的内核。

有没有什么方法可以在 WSL 下运行 perf?


我听说在 WSL2 中可以使用 perf。但是在我升级到 WSL2 后,它显示了类似的错误消息:

警告:找不到内核 4.19.84-microsoft 的性能

您可能需要为此特定内核安装以下软件包:

linux-tools-4.19.84-microsoft-standard

linux-cloud-tools-4.19.84-microsoft-standard
Run Code Online (Sandbox Code Playgroud)

您可能还需要安装以下软件包之一以保持最新状态:

linux-tools-standard

linux-cloud-tools-standard
Run Code Online (Sandbox Code Playgroud)

Bis*_*iyo 34

警告:找不到内核 4.19.84-microsoft 的性能

因为 WSL2 使用自定义 Linux 内核。它的源代码可以在这里找到 microsoft/WSL2-Linux-Kernel。我们必须从中编译性能工具。

程序

  • 安装所需的构建包。如果您在 WSL2 中使用 Ubuntu,则这是必需的命令:
sudo apt install build-essential flex bison libssl-dev libelf-dev
Run Code Online (Sandbox Code Playgroud)
  • 克隆 WSL2 Linux 内核存储库:
git clone --depth=1 https://github.com/microsoft/WSL2-Linux-Kernel.git
Run Code Online (Sandbox Code Playgroud)
  • 转到 perf 文件夹并编译它:
cd WSL2-Linux-Kernel/tools/perf
make
Run Code Online (Sandbox Code Playgroud)

perf 可执行文件将在该文件夹中。

  • Perf 工具源在 https://mirrors.edge.kernel.org/pub/linux/kernel/tools/perf/ 上有独立版本,它比完整的 Linux 内核 git checkout 或下载更容易使用。该站点具有上游 Linux 内核的几个最新版本的性能;它们应该适用于任何内核。或者您可以尝试使用“make perf-targz-src-pkg”从 WSL2 git 生成相同的 targz 文件。另外:您是否检查了生成的 perf 可执行文件 - 哪些有效,哪些无效;`perf list` 中有什么,简单的“echo 1”的 perf stat 表示什么,是否有硬件事件? (2认同)

小智 11

接受的答案有效。但是,缺少一些功能。

为了获得有用且经过整理的信息,我必须安装以下库,然后make再次运行。

  • libbabeltrace-dev
  • libunwind-dev
  • libdw-dev
  • binutils-dev
  • libiberty-dev

我不确定是否所有这些都是必要的。然而,这些足以满足cargo-flamegraph(我的用例)的工作。


小智 10

您可以linux-tools-generic直接通过安装和运行 perf/usr/lib/linux-tools/<linux-version>-generic/perf


Bai*_*ang 9

您可以安装一些通用版本的 perf,而不是 WSL2 版本,例如:

sudo apt install linux-tools-5.4.0-126-generic linux-tools-common
Run Code Online (Sandbox Code Playgroud)

然后当你运行 perf 时,它会出错,例如:

$ perf
WARNING: perf not found for kernel 5.10.16.3-microsoft

  You may need to install the following packages for this specific kernel:
    linux-tools-5.10.16.3-microsoft-standard-WSL2
    linux-cloud-tools-5.10.16.3-microsoft-standard-WSL2
Run Code Online (Sandbox Code Playgroud)

这是因为脚本/usr/bin/perf总是尝试从中获取性能二进制文件uname -r

$ grep uname `which perf`
full_version=`uname -r`
Run Code Online (Sandbox Code Playgroud)

我们可以用实际的 perf 替换 /usr/bin/perf :

mv /usr/bin/perf /usr/bin/perf.bk && ln -s /usr/lib/linux-tools/5.4.0-126-generic/perf /usr/bin/perf
Run Code Online (Sandbox Code Playgroud)

进而:

$ perf stat ls 1>/dev/null

 Performance counter stats for 'ls':

              1.79 msec task-clock:u              #    0.827 CPUs utilized
                 0      context-switches:u        #    0.000 K/sec
                 0      cpu-migrations:u          #    0.000 K/sec
               112      page-faults:u             #    0.063 M/sec
   <not supported>      cycles:u
   <not supported>      instructions:u
   <not supported>      branches:u
   <not supported>      branch-misses:u

       0.002158900 seconds time elapsed

       0.002182000 seconds user
       0.000000000 seconds sys
Run Code Online (Sandbox Code Playgroud)

我认为硬件/缓存计数器在 WSL2 上不可用

  • WSL2 在虚拟机内运行。为了使 HW PMU 事件正常工作,VM + 虚拟机管理程序需要支持它,因此它不允许您分析来宾 VM 之外的内容。(甚至可能获得最后一个分支记录跟踪)。上次我读到,正在开展一些工作,使 KVM 支持 Linux-on-Linux 虚拟化的 PMU 访问,但不知道是否已完成。显然 WSL2 并没有做到这一点。 (2认同)
  • 这正是我现在在我的机器上得到的东西。感谢您澄清这个长期存在的问题。遗憾的是大多数事件都不起作用,因为它使得“perf”在 WSL 中几乎毫无用处...... (2认同)