运行 来自 SPECCpu2006 的已编译二进制文件上带有 Intel-PT 事件的 perf 记录使服务器机器崩溃
Running perf record with Intel-PT event on compiled binaries from SPECCpu2006 crashes the server machine
我在将 perf 与 Intel-PT 事件 一起使用时遇到反复出现的问题。我目前正在 Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz 机器上执行性能分析,具有 x86_64 架构 和 32 个硬件线程启用虚拟化。我专门使用 SpecCPU2006 中的 programs/source 代码进行分析。
我特别观察到我第一次对 SpecCPU2006 中的一个编译二进制文件执行分析时,一切正常,perf.data 文件被生成,这与 Intel-PT 的预期一致。由于 SpecCPU2006 程序是计算密集型的(随时使用 100% 的 CPU),显然 perf.data 文件对于大多数程序来说都很大。对于大多数配置文件,我获得了大约 7-10 GB perf.data 文件。
但是,当我尝试对同一个已编译二进制文件执行第二次分析时,在第一次成功完成之后——我的服务器机器死机了。有时,当我第四次尝试分析第三次 time/the 时(在第二次或第三次分析成功完成后),会发生这种情况。这种行为是高度不可预测的。现在我无法分析任何更多的二进制文件,除非我再次重新启动机器。
我还发布了服务器错误日志,一旦我发现计算机已停止响应,我就会收到这些日志。
Server error logs
显然有一条错误消息说 正在修复递归错误,但需要重新启动!
这种情况发生在特别大的 SpecCPU2006 二进制文件中,这些二进制文件需要 超过 1 分钟才能 运行 没有性能。
发生这种情况有什么特别的原因吗?由于 CPU 使用率高,这不应该发生,因为 运行 没有 perf 或有 perf 的程序,但任何其他硬件事件(可以通过 perf 列表看到)成功完成。这似乎只发生在 Intel-PT 上。
请指导我使用步骤解决这个问题。谢谢
看来我现在已经解决了这个问题。 post 也会有答案。
由于结构 perf_event
的特定成员出现空指针 dereference/access,服务器崩溃了。基本上,成员 perf_event->handle
是罪魁祸首。正如@osgx 所建议的,此信息是从 var/log/syslog 文件中获得的。错误消息的一部分是:-
4 月 19 日 04:49:15###### 内核:[582411.404677] BUG:无法处理 00000000000000ea
处的内核 NULL 指针取消引用
4 月 19 日 04:49:15###### 内核:[582411.404747] IP:[] perf_event_aux_event+0x2e/0xf0
这个结构成员结果为 NULL 的一种可能情况是,如果我甚至在更早的 运行 性能记录完成释放其所有资源之前就开始捕获数据包。这已在内核版本 4.10 中得到妥善处理。我使用的是内核版本 4.4。
我将内核升级到新版本,现在可以正常工作了!
我在将 perf 与 Intel-PT 事件 一起使用时遇到反复出现的问题。我目前正在 Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz 机器上执行性能分析,具有 x86_64 架构 和 32 个硬件线程启用虚拟化。我专门使用 SpecCPU2006 中的 programs/source 代码进行分析。
我特别观察到我第一次对 SpecCPU2006 中的一个编译二进制文件执行分析时,一切正常,perf.data 文件被生成,这与 Intel-PT 的预期一致。由于 SpecCPU2006 程序是计算密集型的(随时使用 100% 的 CPU),显然 perf.data 文件对于大多数程序来说都很大。对于大多数配置文件,我获得了大约 7-10 GB perf.data 文件。
但是,当我尝试对同一个已编译二进制文件执行第二次分析时,在第一次成功完成之后——我的服务器机器死机了。有时,当我第四次尝试分析第三次 time/the 时(在第二次或第三次分析成功完成后),会发生这种情况。这种行为是高度不可预测的。现在我无法分析任何更多的二进制文件,除非我再次重新启动机器。
我还发布了服务器错误日志,一旦我发现计算机已停止响应,我就会收到这些日志。
Server error logs
显然有一条错误消息说 正在修复递归错误,但需要重新启动!
这种情况发生在特别大的 SpecCPU2006 二进制文件中,这些二进制文件需要 超过 1 分钟才能 运行 没有性能。
发生这种情况有什么特别的原因吗?由于 CPU 使用率高,这不应该发生,因为 运行 没有 perf 或有 perf 的程序,但任何其他硬件事件(可以通过 perf 列表看到)成功完成。这似乎只发生在 Intel-PT 上。
请指导我使用步骤解决这个问题。谢谢
看来我现在已经解决了这个问题。 post 也会有答案。
由于结构 perf_event
的特定成员出现空指针 dereference/access,服务器崩溃了。基本上,成员 perf_event->handle
是罪魁祸首。正如@osgx 所建议的,此信息是从 var/log/syslog 文件中获得的。错误消息的一部分是:-
4 月 19 日 04:49:15###### 内核:[582411.404677] BUG:无法处理 00000000000000ea
处的内核 NULL 指针取消引用4 月 19 日 04:49:15###### 内核:[582411.404747] IP:[] perf_event_aux_event+0x2e/0xf0
这个结构成员结果为 NULL 的一种可能情况是,如果我甚至在更早的 运行 性能记录完成释放其所有资源之前就开始捕获数据包。这已在内核版本 4.10 中得到妥善处理。我使用的是内核版本 4.4。
我将内核升级到新版本,现在可以正常工作了!