当使用perf和Intel事件时,我有一个反复出现的问题.我目前正在Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz机器上执行分析,x86_64体系结构和启用虚拟化的32个硬件线程。我特别使用来自SpecCPU2006的程序/源代码进行分析。
我特别注意到,当我第一次对SpecCPU2006编译的二进制文件执行分析时,一切正常,生成了perf.data文件,这与Intel预期的一样。由于SpecCPU2006程序是计算密集型的(在任何时候都要使用100%的CPU ),因此对于大多数程序来说,perf.data文件显然是很大的。我获得了大致的7-10 GB的perf.data文件的大多数剖析程序。
然而,当我第二次尝试在同一个编译的二进制文件上执行分析时,在成功地完成第一个二进制文件之后--我的服务器机器就被冻结了。有时,当我尝试第三次/第四次分析(在第二次或第三次分析成功完成之后)时,就会发生这种情况。这种行为是非常不可预测的。现在,除非我重新启动机器,否则我无法分析任何更多的二进制文件。
我还发布了服务器错误日志,一旦我看到计算机已经停止响应,就会得到这些日志。
显然,有一条错误消息说修复递归错误,但是需要重新启动!
这种情况发生在足够大的SpecCPU2006二进制文件中,这些二进制文件不需要perf.就可以运行超过1分钟。
有什么特别的原因会发生吗?这不应由于CPU使用率过高而发生,因为运行程序时不带perf或使用perf,但任何其他硬件事件(可由perf列表看到)都已成功完成。这似乎只发生在英特尔-PT。
请指导我如何使用这些步骤来解决这个问题。谢谢。
发布于 2017-05-17 04:44:45
看来我现在解决了这个问题。我也会发个答案。
服务器崩溃是因为一个空指针、取消引用/访问发生在结构perf_event
的一个特定成员上。基本上,perf_event->handle
成员就是罪魁祸首。正如@osgx所建议的,这个信息是从var/log/syslog文件中获得的。错误信息的一部分是:-
4月19日04:49:15 ######:582411.404677 BUG:无法在000000000000ea处理内核空指针取消引用
perf_event_aux_event+0x2e/0xf0内核: 582411.404747 IP:[]
这个结构成员最终被证明为NULL的一个可能的场景是,即使在更早的perf记录运行完成释放其所有资源之前,我就开始捕获数据包。这已经在内核版本4.10中得到了正确的处理。我使用的是内核版本4.4。
我把我的内核升级到更新的版本,它现在运行得很好!
https://stackoverflow.com/questions/43377242
复制相似问题