perf监控短生命周期线程时sys_perf_event_open()返回3的解决方法
解决perf stat监控多线程进程时的"No such process"偶发报错
问题背景
执行perf stat -p 4124093 -- sleep 5监控目标进程(PID 4124093)性能时,偶发报错:
The sys_perf_event_open() syscall returned with 3 (No such process) for event (cpu-clock). /bin/dmesg | grep -i perf may provide additional information.
仅在进程繁忙时触发,原因是进程内存在短生命周期线程——perf还未完成事件打开操作,这些线程就已终止,触发内核层面的竞争报错。
可行解决方案
1. 自动重试脚本
因为报错是非必现的,用简单的shell循环实现自动重试,直到采集成功:
while true; do perf stat -p 4124093 -- sleep 5 && break done
优势:快速临时解决,无需修改环境或内核,适合应急排查。
2. 直接监控长生命周期线程
如果能明确进程内的长生命周期线程PID,改用-t <TID>参数监控单个线程,避开短线程的干扰:
perf stat -t <目标线程TID> -- sleep 5
局限:仅适用于能提前确定目标线程的场景,对动态生成短线程的服务不友好。
3. 延迟采集
部分新版本perf支持--delay参数,延迟指定时长后再开始采集,让短生命周期线程先运行结束:
perf stat -p 4124093 --delay 1000 -- sleep 5
其中--delay 1000表示延迟1秒开始采集,可根据短线程的实际生命周期调整毫秒数。
4. 升级内核至修复版本
该问题已在Linux内核的特定提交中修复,该提交已合并到5.10及以上的稳定内核分支。升级到包含此修复的内核版本,可从根本上解决这个竞争问题。
内容的提问来源于stack exchange,提问作者Crown
相关产品推荐
相关产品推荐

