在 podman 容器内使用 perf

问题描述 投票:0回答:1

我想分析使用调试符号编译的应用程序:

$ file ../../bin/linux-x86_64/simulator
../../bin/linux-x86_64/simulator: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=156bbd57d203d72f4226ed4ad0727bcf472f83ef, for GNU/Linux 3.2.0, with debug_info, not stripped

它在 podman 容器内运行。容器是 debian 11,主机是 ubuntu 22.04。我之前已经能够使用 perf 了,但我一定忘记了一些必要的配置。

我在容器外做的:

sudo sysctl kernel.perf_event_paranoid=-1

然后进入容器:

podman run --privileged --entrypoint=bash --network=host --rm -it -v ./st.cmd/:/opt/ad-sim-epics-ioc/iocBoot/iocsimulator/st.cmd -v /home/marco:/home/marco ghcr.io/cnpem/ad-sim-epics-ioc:v1.0.0

最后安装 perf:

apt-get 更新 && apt-get 安装 linux-perf

获取分析器结果:

perf record -g ./st.cmd # st.cmd is an interpreter with shebang poiting to ../../bin/linux-x86_64/simulator

第一次尝试时,系统会抱怨:

/usr/bin/perf:第 13 行:执行:perf_5.15:未找到

但是自从我发现几个人声称可以复制或符号链接性能:

ln -s /usr/bin/perf_5.10 /usr/bin/perf_5.15

最后:

perf record -g ./st.cmd
(do things...)
^C
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.128 MB perf.data (2500 samples) ]

perf script -F +pid > script.txt

但是绝对没有显示用户空间函数,只有内核 kallsyms:

我尝试使用和不使用 --privileged 标志运行容器,尝试了 perf record --call-graph dwarf、perf record --call-graph fp,但什么也没有。我清楚地记得只需使用 perf record -g 就能看到功能...我做错了什么?

提前感谢任何帮助这个迷失、绝望的灵魂的人。

perf podman
1个回答
0
投票

好吧,我认为这实际上都是内核的错。

不久前,在我考虑分析之前,我从服务器收到了以下消息:

但由于它是生产服务器,并且内核更新导致某些驱动程序混乱,因此我在 /etc/default/grub 文件中将内核版本修复为 5.15.0-91。

原来我之前安装的 perf 无法处理旧的内核版本。当我想起这一点并更新了内核(从而暂时牺牲了我的操作)时,perf 甚至在容器内也开始工作。

© www.soinside.com 2019 - 2024. All rights reserved.