如何查找网站上线/下线的原因

如何查找网站上线/下线的原因

今天我管理的一个网站似乎一整天都在上线和下线。我不知道是什么原因导致了这个问题,所以我想寻求指导,看看从哪里开始。这是一个基于 Wordpress 的网站。

以下是我所知道的:

我使用一个程序,该程序每分钟 ping 服务器一次,当服务器没有响应时,它会给我发送电子邮件,这样我就能准确地知道网站何时在线和离线。网站在 12.28 晚上 8 点到 12 点之间,以及 12.29 凌晨 1 点左右(纽约市时区,以下所有时间均在同一时区)。

在网站运行/宕机时,我发现内存使用量非常大。查看网站在线/离线时的平均负载(http://screencast.com/t/BRlfXkqrbJII)。然后我运行此命令来重新启动 http(http://screencast.com/t/usVtYWZ2Qi)然后内存使用量下降到这个(http://screencast.com/t/VdTIy3bgZiQB)。在我重新启动 http 一个小时后,该网站就离线/在线了,所以重新启动 http 并没有太大的帮助。

当网站离线/在线时,我运行了 top 命令并得到了这个(http://screencast.com/t/zEwr7YQj3)。这是当站点处于最低状态时的一个 top 命令(http://screencast.com/t/eaMfha9lbT- 因此这被称为“正常”)。

以下是带宽报告(http://screencast.com/t/AS0h2CH1Gypq)。

交通似乎没有那么多(http://screencast.com/t/s7hrWNNic1K),但看我的网站时好时坏,这可能是原因之一?

我在 Media Temple 有 dvp Nitro 包(http://mediatemple.net/webhosting/nitro/)。

因此,此时,我会请求一些帮助,试图找出造成这种情况的原因,以及如何着手查明这个问题。任何帮助都将不胜感激。

答案1

30 秒内的平均负载很高,并且 CPU 处于 100% 繁忙状态。HTTPD 进程的 CPU 使用率相当均匀,因此它不是一个特定的恶意进程。基本上,您的服务器无法处理它正在接收的并发 HTTP 请求数量。

也许您可以采取一些措施来减少生成页面所需的处理量。

您可以查看 Apache 服务器日志,尝试查看为什么加载如此不均匀。也许您正遭受 DDOS 攻击 - 如果是这样,您可以采取一些措施来减轻影响。

要么这样,要么您需要一个更大的服务器。


也许 MediaTemple 有问题 - 请参阅如何优化高流量的 Wordpress 网站?

答案2

我使用一个每分钟 ping 服务器的程序

然后,您将监控您与网站所在系统之间的每个网络设备。事实上,您几乎测量了除实际网站之外的所有东西。当然,如果运行 Web 服务器的计算机无法响应 ping,那么它可能也不会响应 HTTP 请求。

查看提供的其他详细信息,似乎是 HTTP 处理导致了问题 - 但是,如果它由于 HTTP 处理而无法响应 ping,那么这就是一个设置非常糟糕的服务器。

这可能是 DOS 攻击 - 但我怀疑更有可能的是某个地方正在形成竞争条件。您的 HTTP 流量发生了什么?您是否从几个主机获得了突发活动?响应时间是领先还是落后于平均负载?

您提供的图表和报告有点帮助 - 但这里几乎没有什么信息可以作为诊断依据 - 您真的需要查看热率的平均值,最多是按分钟而不是按小时。那么 0 点的那个巨大峰值呢?这对我来说看起来很奇怪。

虽然您可以开始记录 %D 并安装/配置 mod-log-firstbyte 来查看问题出现的位置,但您可以使用 PHP 自动添加功能以更少的侵入性完成所有操作,例如,以下内容将在处理开始时写入日志条目并记录大量有关处理请求时所做工作的信息。

<?php
   global $error_log, $start_time;
   // IIRC wordpress implement output buffering so no need to do it here.
   $error_log=@fopen('php://stdin','w');
   $start_time=microtime(true);
   @fputs($error_log, date('r') 
       . getmypid() . 
       . " started  \"" 
       . $_SERVER['REQUEST_URI'] . '"');
   @register_shutdown_function('log_complete');
   function log_complete()
   {
      global $error_log, $start_time;
      $r=getrusage();
      @fputs($error_log, date('r') 
       . getmypid() . 
       " finished " .
       memory_get_usage() . ' ' .
       microtime(true)-$start_time . ' ' .
       var_export($r, true));
   }

相关内容