You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 13:55:16