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 的性能
您可能需要为此特定内核安装以下软件包:
Run Code Online (Sandbox Code Playgroud)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
Bis*_*iyo 34
警告:找不到内核 4.19.84-microsoft 的性能
因为 WSL2 使用自定义 Linux 内核。它的源代码可以在这里找到 microsoft/WSL2-Linux-Kernel。我们必须从中编译性能工具。
sudo apt install build-essential flex bison libssl-dev libelf-dev
Run Code Online (Sandbox Code Playgroud)
git clone --depth=1 https://github.com/microsoft/WSL2-Linux-Kernel.git
Run Code Online (Sandbox Code Playgroud)
cd WSL2-Linux-Kernel/tools/perf
make
Run Code Online (Sandbox Code Playgroud)
perf 可执行文件将在该文件夹中。
小智 11
接受的答案有效。但是,缺少一些功能。
为了获得有用且经过整理的信息,我必须安装以下库,然后make再次运行。
libbabeltrace-devlibunwind-devlibdw-devbinutils-devlibiberty-dev我不确定是否所有这些都是必要的。然而,这些足以满足cargo-flamegraph(我的用例)的工作。
您可以安装一些通用版本的 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 上不可用