我有一个 m1.small EC2 实例,它主要运行 Apache 作为几个简单 PHP 网站(使用 RDS 作为数据库)的 Web 服务器。服务器的平均负载始终非常高 - 大约 8,并且从不低于 5。这导致我的网站速度慢得令人烦恼,远远超出了我对 2.6GHz CPU 和 1.7GB RAM 的预期。
top
和朋友们表明,除了大约 50% 的“窃取”时间(AFAIU,虚拟机管理程序为同一 CPU 上的其他虚拟机窃取的时间)之外,其余的几乎完全是“IRQ”时间。
mpstat
说这个时间花费在非常稳定的 191.59 中断/秒上(即该数字几乎不随时间变化),并且根据“/proc/interrupts”,这些时间主要花费在xen-percpu-virq timer0
和 上xen-dyn-event eth0
。
这些是什么?如何让 EC2 实例降低负载并在我的 PHP 网站上花费更多时间?
答案1
经过一段时间的观察,这似乎是一个“硬件问题” - 很可能托管虚拟机的物理服务器承受着来自其他虚拟机的重负载,并且该m1
类型的机器无法获得有保证的性能,因此您会得到任何 CPU 时间留在主机上。更糟糕的是,如果您的虚拟机在 CPU 核心 0 上运行,您还将获得计算机上的所有中断处理。看到这个Xen 维基文章在“HVM VM 的第一个(也可能是唯一的)VCPU 已完全利用。”下。另请参阅此AWS 支持线程对于其他有类似中断问题的人。
此时唯一的解决方案是将您的虚拟机迁移到另一台物理主机。有时可以通过停止虚拟机、等待几分钟并重新启动来非常简单地完成此操作 - 如果 EC2 同时为您的旧主机分配了另一个虚拟机,那么您可以获得不同的插槽,问题可能会得到解决。
如果这不起作用,最好的办法是从您的虚拟机创建一个新映像,并在另一个可用区上启动它。这将导致 IP 被替换,并且可能需要更新安全组和防火墙规则。另外,请确保在创建映像之前停止 VM - 以确保在创建映像之后和启动新 VM 之前,旧 VM 不会生成新数据。