如何用perf buildid-list区分容器中路径相同的文件?
解决宿主机perf采样多容器同路径不同buildid二进制的问题
问题根源
当多个容器内存在路径相同但buildid不同的二进制文件(比如都有/tmp/a.out)时,perf会以文件路径作为唯一标识存储buildid,后采样到的同路径文件的buildid会覆盖之前的,最终perf buildid-list只能看到一个。
解决方案
1. 采样时自动识别容器上下文
如果你的perf版本(通常4.14+内核配套版本已支持)支持--container参数,执行采样时添加该参数,让perf记录每个进程所属的容器ID,自动区分不同容器内的同路径文件:
perf record -a --container -- sleep 3
后续执行perf buildid-list或解析数据时,perf会基于容器维度区分同路径文件的buildid。
2. 手动关联容器二进制与buildid
若--container参数不可用,可手动提取容器内二进制的buildid并添加到perf缓存:
- 从各容器拷贝目标二进制到宿主机的独立路径,比如容器A的
/tmp/a.out拷贝到宿主机/tmp/container_a/a.out,容器B的拷贝到/tmp/container_b/a.out - 分别计算两个文件的buildid:
perf buildid-list -i /tmp/container_a/a.out perf buildid-list -i /tmp/container_b/a.out
- 将文件添加到perf的buildid缓存:
perf buildid-cache -a /tmp/container_a/a.out perf buildid-cache -a /tmp/container_b/a.out
之后解析perf.data时,perf会通过buildid而非路径匹配对应的二进制文件。
3. 解析时指定容器根文件系统
如果已生成perf.data,可在解析时用--symfs参数指定对应容器的根文件系统,确保加载正确的符号:
# 解析容器A的采样数据 perf report --symfs /path/to/container_a/rootfs -i perf.data # 解析容器B的采样数据 perf report --symfs /path/to/container_b/rootfs -i perf.data
需提前将容器的根文件系统挂载或完整拷贝到宿主机的对应路径。
关键提示
- 优先使用
--container参数,这是最省心的方式,perf会自动处理容器维度的buildid区分 - 手动关联buildid时,必须保证拷贝的二进制与采样时容器内的文件完全一致(buildid匹配)
--symfs适合仅需解析单个容器数据的场景,每个容器需单独执行解析命令
内容的提问来源于stack exchange,提问作者zcfh
相关产品推荐
相关产品推荐

