__ticket_spinlock 高 CPU

__ticket_spinlock 高 CPU

我们的 Ubuntu 10.04 KVM 基础架构出现了一个奇怪的问题,即两个虚拟机 Web 服务器中的一个会定期发生故障,即使我们重新启动应用程序,负载也会持续处于高位。(这是虚拟机中唯一使用大量系统资源的东西)如果我们完全停止 Web 服务器守护进程,负载会下降,但当我们再次启动它时,负载会回升到高位。重新启动虚拟机客户机可以解决问题,在问题再次出现之前,它可以正常运行几天。

最近,我们在虚拟机管理程序上安装了“perf”,并注意到在高负载期间,内核函数“__ticket_spinlock”占用了很大比例的 CPU(30-60%),而正常运行期间则不到 1%。重新启动高负载的虚拟机可以解决此问题。在对自旋锁和票证自旋锁进行一些研究后,我们得出了这样的假设:高负载的虚拟机正在等待其他虚拟机持有的锁,但由于某种原因没有得到它。

我们发现存在此问题的虚拟机管理程序与之前部署的 CentOS 虚拟机管理程序之间存在差异(在众多差异中),虽然配置类似,但实际上并非如此。Ubuntu 10.04 虚拟机管理程序的内核使用不同的默认 IOScheduler(截止期限)进行编译,并且 preempt_voluntary 处于关闭状态。我们已经在两个站点之间同步了这些配置,并且正在等待查看更新后的虚拟机管理程序上的虚拟机是否再次出现故障。

** 编辑:我们始终无法找到根本原因,但自从迁移到 Ubuntu 14.04 后,我们就再也没有看到过这个问题。

当 Linux 进程处于自旋锁/票证自旋锁中时,是否有任何方法可以检测它正在等待哪个设备? 是否有任何方法可以检测哪个 Linux 进程锁定了某个特定设备?

相关内容