我的服务器崩溃了,我已经检查了所有内容:还剩下什么?

我的服务器崩溃了,我已经检查了所有内容:还剩下什么?

我有一个 m1.medium Amazon EC2 实例,运行 Apache 并托管一个 Wordpress 博客。反过来,Wordpress 与另一个 EC2 实例上的 MySQL 数据库一起工作。Wordpress 网站已设置 W3 Total Cache 并运行良好,网站上的大部分静态内容由 CDN 提供。该网站的流量通常很少,然后偶尔会出现一些巨大的流量高峰……当这些高峰出现时(超过约 150 人访问该网站),该网站就会瘫痪。我还可以借助一些负载测试工具每次都让这种情况发生。

这是主服务器空闲时的“顶部”:

top - 23:21:23 up 103 days, 19:40,  3 users,  load average: 0.91, 0.60, 0.62
Tasks:  93 total,   1 running,  92 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.9%sy,  0.0%ni, 99.1%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   3844856k total,  1756268k used,  2088588k free,   150132k buffers
Swap:        0k total,        0k used,        0k free,   833740k cached

但是,如果我进行一些负载测试来模拟数百个用户访问静态图形文件(这显然不会触发 Wordpress、PHP 或数据库),一切都很好:服务器负载保持在较低水平,图形文件快速提供,等等。

我的 Apache 设置(服务器内存 3.1G / 每个 httpd 实例约 8100k = 约 400 MaxClients):

    StartServers         5
    MinSpareServers      5
    MaxSpareServers     10
    ServerLimit        400
    MaxClients         400
    MaxRequestsPerChild  0

因此,基于所有这些,问题似乎与使用 PHP 或 MySQL 有关。

在 MySQL 服务器上,无论我做什么,负载基本保持在 0,慢速查询日志保持为空……所以我认为那里一切正常。以下是我对 SQL 服务器的“top”:

top - 23:20:21 up 103 days, 19:12,  5 users,  load average: 0.08, 0.03, 0.05
Tasks: 115 total,   1 running, 114 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   3844856k total,  1076912k used,  2767944k free,   158412k buffers
Swap:        0k total,        0k used,        0k free,   638092k cached

这一切都让我想到,以下不太可能发生的情况之一正在发生:

  • 这台机器的原始马力根本无法满足 150 多个并发用户的需求,我应该升级到 L 或 XL EC2 实例。也许吧,但是……真的吗?对于一个相对强大的服务器来说,150 个用户太多了m1.中等服务器?
  • Apache 根本就不是为处理这种流量而设计的。值得怀疑。
  • Web 和数据库服务器之间的通信存在问题。但我对此表示怀疑,因为这是两个 Amazon EC2 实例之间的通信。

我觉得我已经检查了所有能检查的,但还是没找到。我还应该检查什么?我还能尝试什么?

答案1

在这种情况下,m1.medium 的“马力”相当于一个 CPU,显示 top 时负载为 0.91。负载为 0.91 意味着“现在,一个 CPU 的 91% 的工作正在被进程请求。”简而言之,当您处于空闲状态时,似乎有什么东西占用了您的 CPU。

假设这就是问题所在,我会削减消耗 CPU 的服务。如果这在您的主服务器上不是一个选项,我会为您现有的机器创建一个 ami,然后再旋转两个主机,实例类型为 t1.micro,并确保只有最低限度的服务在其上运行(在本例中为 apache)。然后循环 dns 您的网站地址。这将有效地将您的突发 CPU 容量增加三倍,同时提供 2 倍的 CPU 基线。

答案2

我们通过 EC2 上的较小实例为大量用户提供服务(并且使用 apache 基准测试最多 1000 个并发会话)。

好消息是您可以重现它。

您可以检查很多事情:

  1. 在两台服务器上都放置一个类似 new relic 的工具(首先使用免费版本来记录 CPU/内存历史记录)。这对于趋势分析来说还是不错的。

  2. 从 2 个服务器之间的通信开始。进行一些文件传输并检查速度。

  3. 我们遇到了 wp-cron.php 不时关闭 wordpress 服务器的问题。尝试禁用该问题并将其每隔几分钟移至 cron 调用。

报告你的发现,我可以提出更多想法。

相关内容