perf stat进程模式下sys_perf_event_open()返回3的问题求助
问题与解决思路
问题场景
我在使用perf_4.9的进程模式(-p选项)统计Docker容器内应用的缓存事件数据时遇到随机报错:
- 初始流程是先启动wrk2发送负载请求,再执行perf stat测量
- 报错原因推测为:perf要监控的部分PID在事件打开前已终止,但perf_4.9不会忽略这类已终止进程,直接抛出错误
- 调整为先启动perf stat再启动wrk2后,错误次数减少,但仍随机出现
- 补充细节:
- 示例命令:
perf stat -e r8024,LLC-load-misses,LLC-store-misses -p $PID sleep 20,需统计L1、L2、L3缓存相关事件 - wrk2运行时长约2分钟,期间串行执行5次perf stat,错误随机出现在不同的命令中
- 示例命令:
可行解决方案
- 预过滤存活PID:执行perf前先校验目标PID是否存活,只传入有效PID,避免监控已终止进程。用bash脚本实现:
# 假设$PID_LIST是待监控的PID集合 LIVE_PIDS="" for pid in $PID_LIST; do # 检查进程是否存活,无输出则代表已终止 if kill -0 "$pid" 2>/dev/null; then LIVE_PIDS="$LIVE_PIDS $pid" fi done # 仅当存在存活PID时执行perf if [ -n "$LIVE_PIDS" ]; then perf stat -e r8024,LLC-load-misses,LLC-store-misses -p $LIVE_PIDS sleep 20 else echo "无可用的存活进程可监控" fi - 切换为容器级监控:利用perf的cgroup监控能力直接针对容器,无需手动追踪PID(需内核支持perf cgroup监控):
# 替换<container-id>为目标容器的ID或名称 perf stat -e r8024,LLC-load-misses,LLC-store-misses -G docker/<container-id> sleep 20 - 升级perf版本:perf_4.9的这个问题在5.x及以上版本中已被修复,新版本会自动忽略已终止的PID,不会触发报错。若环境允许,升级perf是最彻底的解决方式。
- 增加perf启动后的等待时间:先启动perf后,短暂等待确保目标进程稳定,再开始统计:
# 先等待2秒让进程稳定,再执行20秒的统计 perf stat -e r8024,LLC-load-misses,LLC-store-misses -p $PID sh -c "sleep 2; sleep 20"
内容的提问来源于stack exchange,提问作者skoupas
相关产品推荐
相关产品推荐

