在我们的Ubuntu 10.04 KVM基础设施上,我们遇到了一个奇怪的问题,即使我们重新启动应用程序,周期性地,两个vm web服务器中的一个出现负载持续很高的情况。 (在vm中使用任何重要的系统资源的唯一方法)如果我们完全停止了webserver守护进程,负载确实会下降,但是当我们重新启动时,负载会跳回到高水平。 vm guest虚拟机的重新启动清除了问题,在问题返回之前它可以正常运行好几天。
最近,我们在pipe理程序上安装了“perf”,并注意到在高负载期间,内核函数“__ticket_spinlock”使用CPU的比例很高(30-60%),而在正常操作期间低于1%。 高负载的虚拟机重新启动清除了这一点。 做一些研究,了解自旋锁和自旋锁,我们已经提出了一个假设,即经历高负载的虚拟机正在等待其他虚拟机持有的锁,并且由于某种原因没有得到它。
我们发现有这个问题的pipe理程序与之前部署的CentOS有不同之处,但是没有这样做。 Ubuntu 10.04虚拟机pipe理程序的内核使用不同的默认IOScheduler(截止date)进行编译,并且preempt_voluntary处于closures状态。 我们已经在两个站点之间同步了这些configuration,并且正在等待更新后的pipe理程序上的虚拟机是否再次出现exception。
**编辑:我们从来没有find根本原因,但自迁移到Ubuntu 14.04以来,我们再也没有看到这个问题。
有什么办法可以检测Linux进程正在等待什么设备,当它在自旋锁/自旋锁中? 有什么办法可以检测到Linux进程在特定设备上有锁吗?