6

我在我的 KVM 虚拟机中运行 SPECJbb 基准测试。它显示 Warehouse 2 和 Warehouse 3 之间的吞吐量急剧下降(它们之间的不同只是增加了并发任务)

然后我在我的来宾虚拟机中使用 perf。它表明_spin_unlock_irqrestore 具有非常高的采样率。

事件:31K 周期

  • 74.89% [内核] [k] _spin_unlock_irqrestore

  • 7.36% perf-1968.map [.] 0x7f84b913e064

  • 6.82% [内核] [k] __do_softirq

  • 6.39% [内核] [k] handle_IRQ_event

...

似乎只有 7.36% 的 cpu 时间运行我的 Java 程序。为什么_spin_unlock_irqrestore的采样率这么高?它有什么作用?

4

1 回答 1

9

这是糟糕的报告perf,而不是消耗的周期_spin_unlock_irqrestore

当 IRQ 被禁用时,不会处理 perf 的中断。相反,它们会在重新启用中断时进行处理。当 perf 的中断处理程序查看指令指针以查看正在运行的代码时,它会找到启用中断的函数 - 通常是_spin_unlock_irqrestore.

因此,您所知道的是,这些周期被禁用中断并使用_spin_unlock_irqrestore.

如果您可以使用 NMI(不可屏蔽中断)获得性能,它可以解决这个问题。
我知道可以通过更改makefile来使用oprofile(perf的前身)来完成,但不知道perf。

于 2013-02-05T15:19:30.603 回答