Linux kernel _spin_unlock_irqrestore()在我的kvm中具有非常高的采样率,为什么?

Linux kernel _spin_unlock_irqrestore()在我的kvm中具有非常高的采样率,为什么?,linux-kernel,kvm,Linux Kernel,Kvm,我在KVM虚拟机中运行SPECJbb基准测试。它显示了仓库2和仓库3之间的吞吐量急剧下降(它们之间的差异只是增加了并发任务) 然后在来宾虚拟机中使用perf。结果表明,自旋解锁irqrestore具有很高的采样率 事件:31K周期 74.89%[内核][k]\u自旋\u解锁\u irqrestore 7.36%性能-1968.map[.]0x7f84b913e064 6.82%[内核][k]\u do\u软件质量 6.39%[kernel][k]处理IRQ事件 似乎只有7.36%的cpu时

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

然后在来宾虚拟机中使用perf。结果表明,自旋解锁irqrestore具有很高的采样率

事件:31K周期

  • 74.89%[内核][k]\u自旋\u解锁\u irqrestore

  • 7.36%性能-1968.map[.]0x7f84b913e064

  • 6.82%[内核][k]\u do\u软件质量

  • 6.39%[kernel][k]处理IRQ事件


似乎只有7.36%的cpu时间运行我的Java程序。为什么旋转解锁irqrestore的采样率这么高?它是做什么的?

它是由
性能的不良报告,而不是由
\u spin\u unlock\u irqrestore
消耗的周期

禁用IRQ时,不处理性能中断。相反,它们是在中断重新启用时处理的。当perf的中断处理程序查看指令指针以查看运行的代码时,它会找到启用中断的函数—通常是
\u spin\u unlock\u irqrestore

因此,您所知道的是,这些周期被禁用中断的代码占用,并使用
\u spin\u unlock\u irqrestore
启用它们

如果您可以让perf使用NMI(不可屏蔽中断),它可以解决这个问题。

我知道可以使用oprofile(perf的前身)通过更改makefile来完成,但不知道perf。

谢谢您的回答。你能给我解释一下为什么IRQ禁用时间这么长吗?这是因为我在kvm中运行它吗?谢谢