- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用在 docker 容器中运行的性能分析 golang 程序
我记录数据
# perf record -o "perf.data" -p `PID of the container`
并阅读
# perf report -i "perf.data"
一开始一切正常,我得到这样的报告(我的 elf 二进制名称是 bin
):
Samples: 15 of event 'cpu-clock', Event count (approx.): 3750000
Overhead Command Shared Object Symbol
53.33% bin bin [.] runtime.scanobject
6.67% bin [kernel.kallsyms] [k] __schedule
6.67% bin bin [.] runtime.getStackMap
6.67% bin bin [.] runtime.getempty
6.67% bin bin [.] runtime.gopark
6.67% bin bin [.] runtime.greyobject
6.67% bin bin [.] runtime.scanblock
6.67% bin bin [.] runtime.unlock
但是在我停止容器并再次运行报告命令之后,我程序中的所有符号都变成了十六进制地址(内核符号仍然解析)
Samples: 15 of event 'cpu-clock', Event count (approx.): 3750000
Overhead Command Shared Object Symbol
33.33% bin bin [.] 0x000000000001f7ad
13.33% bin bin [.] 0x000000000001f7b0
6.67% bin [kernel.kallsyms] [k] __schedule
6.67% bin bin [.] 0x000000000000ac1a
6.67% bin bin [.] 0x000000000001f497
6.67% bin bin [.] 0x000000000001f7d6
6.67% bin bin [.] 0x000000000001fc82
6.67% bin bin [.] 0x00000000000242fd
6.67% bin bin [.] 0x0000000000035bf0
6.67% bin bin [.] 0x000000000004d5a9
我试图找到二进制文件的构建 ID,但没有得到任何线索:
# perf buildid-list -i perf.data
38b62c386e959108a2ff514c04f7df8f39e443f9 [kernel.kallsyms]
78fa50e860a2bb2b44f03a6a0a6f99735a8b599b [vdso]
根据@osgx 的建议,我在下面运行命令
#perf script -D |grep PERF_RECORD_MMAP2|head
Failed to open /bin, continuing without symbols
0 0x2b98 [0x60]: PERF_RECORD_MMAP2 15956/15956: [0x400000(0x852000) @ 0 fc:01 656204 7434654850458070581]: r-xp /bin
0 0x2bf8 [0x60]: PERF_RECORD_MMAP2 15956/15956: [0x7ffca95a8000(0x2000) @ 0 00:00 0 7434654850458070581]: r-xp [vdso]
0 0x2c58 [0x68]: PERF_RECORD_MMAP2 15956/15956: [0xffffffffff600000(0x1000) @ 0 00:00 0 7434654850458070581]: r-xp [vsyscall]
0 0x2ce8 [0x60]: PERF_RECORD_MMAP2 15956/16020: [0x400000(0x852000) @ 0 fc:01 656204 7434654850458070581]: r-xp /bin
0 0x2d48 [0x60]: PERF_RECORD_MMAP2 15956/16020: [0x7ffca95a8000(0x2000) @ 0 00:00 0 7434654850458070581]: r-xp [vdso]
0 0x2da8 [0x68]: PERF_RECORD_MMAP2 15956/16020: [0xffffffffff600000(0x1000) @ 0 00:00 0 7434654850458070581]: r-xp [vsyscall]
0 0x2e38 [0x60]: PERF_RECORD_MMAP2 15956/16021: [0x400000(0x852000) @ 0 fc:01 656204 7434654850458070581]: r-xp /bin
0 0x2e98 [0x60]: PERF_RECORD_MMAP2 15956/16021: [0x7ffca95a8000(0x2000) @ 0 00:00 0 7434654850458070581]: r-xp [vdso]
0 0x2ef8 [0x68]: PERF_RECORD_MMAP2 15956/16021: [0xffffffffff600000(0x1000) @ 0 00:00 0 7434654850458070581]: r-xp [vsyscall]
0 0x2f88 [0x60]: PERF_RECORD_MMAP2 15956/16022: [0x400000(0x852000) @ 0 fc:01 656204 7434654850458070581]: r-xp /bin
为什么会这样?有什么解决方案让 perf 在容器停止后解析符号吗?
这是我的环境:
perf version 4.15.18
Ubuntu 18.04 LTS (GNU/Linux 4.15.0-23-generic x86_64)
docker version 18.06.1-ce
我的容器 Dockerfile
FROM scratch
COPY artifact/bin /
ENTRYPOINT ["/bin"]
最佳答案
Why is that happen?
perf 工具正在对二进制文件进行某种搜索。在 perf.data
中记录了 mmap(使用 perf script -D |grep PERF_RECORD_MMAP2|head
命令查看),其中文件路径映射到 EXEC 权限。主二进制文件也被映射,但在映射时路径是相对于容器的。在容器中,此文件具有 /bin
路径,就像您使用 COPY artifact/bin/
放置它一样。但是 perf report
是在容器外部启动的,并尝试在容器 fs cgroup/namespace 之外解析 /bin
路径。在主机系统中 /bin
是目录,而不是文件。当您在容器仍在运行时启动 perf report
时,它可能会通过一些启发式方法在 /proc/$PID/exe
特殊 fs 的帮助下获取可执行文件,这可能会成功在访问容器 fs 命名空间内的文件时。
Is there any solution let perf resolve symbol after container stop ?
我没有太好的建议(在评论中):将工件二进制文件放入容器中的路径,该路径与二进制文件的实际位置相等。例如,如果您将二进制文件作为 /home/pexie/project1/artifact/bin
;在 dockerfile 中创建目录 /home/pexie/project1/artifact/
并将二进制文件放入该目录。
关于docker - docker 容器停止后 perf 无法解析符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60880117/
使用以下方法记录了一些统计数据: perf record -a -F 20 -o perf.data -e major-faults sleep 1800 并获得 perf.data ~ 1GiB,样
我在 ARM 板上的旧版本内核上运行 perf record。内核版本为3.18.21-rt19 板子上的perf版本同样是perf version 3.18.21。 虽然我可以在此性能上记录和使用报
与 perf (the Linux profiler) , (v4.15.18),我可以运行 perf stat $COMMAND 来获取命令的一些简单统计信息。如果我运行 perf record,它
尝试使用性能分析器。我已经安装了 linux 通用工具,但没有成功。这是我收到的消息: r@r-K55A:~$ perf WARNING: perf not found for kernel 3.16
perf stat -e 许多不同的事件通常会返回这样的输出 127.352.815.472 r53003c
假设我有一个线束二进制文件,它可以根据命令行选项产生不同的基准。我对采样这些基准非常感兴趣。 我有3个选择: 更改线束二进制文件以生成一个“性能记录”子进程,该子进程运行基准测试并进行采样 只需执行“
当我想使用 Linux 工具套件中的 perf-stat 和 perf-report 生成性能报告时 perf ,我跑: $ perf record -o my.perf.data myCmd $ p
我试图解释 perf-stat 在程序上运行的结果。我知道它是用 -r 30 和 -x 运行的。来自 https://perf.wiki.kernel.org/index.php/Tutorial是说
我使用 perf sched record 来记录一些东西。 我从 perf sched script 得到了一些context switch 事件 filebench 2646 [000] 211
当我从谷歌下载android源码4.3时,发现$AOSP/extenal/linux-tools-perf中已经存在perf源码。但是在我为模拟器编译项目之后,我没有在 system/bin 中找到'
我正在研究使用 Protractor 进行工具性能测试。我遇到了 browser-perf 和 protractor-perf。 protractor-perf 基于 browser-perf。 据我
我正在运行 kernel-5.0.9-200.fc29.x86_64(以及具有相同版本号的 perf 包)。 在下面的命令中,报告的 msec task-clock 远远大于 seconds user
我正在尝试使用 TraceCompass 以进一步调查我的系统跟踪。为此,您需要 CTF 格式,并且有两种可能的方法在 Linux 中获取它,afaik: 使用 LTTng 进行跟踪并使用 CTF 格
我正在使用 perf 分析一个玩具程序(选择排序),我想知道 perf 报告输出中的迭代对应什么。它显示的地址对应于内部循环和 if 语句。我希望有人能提供帮助。另外,当我将“-b --branch-
我遵循了现有 Stackoverflow 问题/答案提供的说明 Building Perf with Babeltrace (for Perf to CTF Conversion) 使用 Babelt
我正在浏览 linux 内核源代码中的 perf 源代码,以了解如何实现用户空间探测。我在很多地方都遇到过这种情况: zalloc(sizeof(struct __event_package) * n
我很清楚 perf 总是记录一个或多个事件,并且采样可以是基于计数器或基于时间的。但是当 -e 和 -F 开关没有给出时,perf record 的默认行为是什么? perf-record 的手册页没
运行时perf它找到了我的程序的内核符号和符号,但没有找到外部模块符号。我编写了一个内核模块,我使用 insmod 加载它我怎么知道perf也找到它的符号? 我正在运行 2.6.37.6 内核(无法升
我正在尝试学习如何在运行一些用 C 编写的基于 JNI 的共享库的 java 应用程序上使用 perf 动态跟踪。该库通过路径 /opt/myapp/lib/libmyapp.so 安装,然后使用选项
我用perf脚本命令查看perf.data文件的结果,但我不是很明白每一列的含义。例如,如果我有以下结果: perf 3198 [000] 13156.201238: bus-cycles: ff
我是一名优秀的程序员,十分优秀!