
今天我管理的一個網站似乎一整天都在線上和離線。我不知道是什麼導致了這個問題,所以我正在尋求從哪裡開始的指導。這是一個基於 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)。這是當網站處於最低狀態時的頂部命令(http://screencast.com/t/eaMfha9lbT- 所以這將被稱為“正常”)。
這是頻寬報告(http://screencast.com/t/AS0h2CH1Gypq)。
人流好像沒那麼大(http://screencast.com/t/s7hrWNNic1K),但是看看我的時間,網站正在上升/下降,這可能是原因之一?
我在 Media Temple 有 dvp Nitro 包(http://mediatemple.net/webhosting/ninto/)。
因此,此時我會請求一些幫助來嘗試找出原因是什麼,以及如何找出這個問題。任何幫助是極大的讚賞。
答案1
30秒左右平均負載較高,CPU 100%繁忙。 HTTPD 進程中的 CPU 使用率相當均勻,因此它不是一個特定的惡意進程。基本上,您的伺服器無法處理它接收到的並發 HTTP 請求的數量。
您可能可以採取一些措施來減少產生頁面所需的處理量。
您可以查看 Apache 伺服器日誌,嘗試了解載入如此不均勻的原因。也許您正成為 DDOS 攻擊的目標 - 如果是這樣,您可以採取一些措施來減輕影響。
要么你需要一個更大的伺服器。
也許 MediaTemple 有問題 - 請參閱如何優化高流量 WordPress 網站?
答案2
我使用一個每分鐘 ping 一次伺服器的程序
然後,您將監視您與網站所在系統之間的每個網路設備。事實上,除了實際網站之外,您幾乎正在測量所有內容。當然,如果運行網頁伺服器的電腦無法回應 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));
}