2011-06-27 37 views
0

我們有一個基於PHP的Web應用程序,並在2天內都期待在流量大穗。創建友好的流量高峯的消息是停止現場死亡

我們建立在一個標準的Rackspace LAMP堆棧上,並且會盡可能多地放置服務器,但應用程序的內存和數據庫密集程度相當高,所以會出現一些最大併發用戶數的上限,我們將無法使用超過我們擁有的少量時間。

我們一直在努力實現的memcached,但由於應用程序的性質,被證明是難以有效地做到。

的流量只預計將持續幾個小時,我們主要關心的是,該網站不會崩潰這將帶來的銷售停滯。

請告訴我,以顯示一個錯誤,指出消息的最簡單的方法「抱歉,我們遇到交通繁忙,請稍後再試。」當服務器負載過重時?

通過這種方式,我們可以爲我們正確的Web應用程序,然後當請求隊列開始填充起來,然後我們就可以服務於簡單的靜態友好的HTML交通消息。

我知道,用一種天真的方法,這將意味着一些正在買東西的人會得到錯誤信息,然後可能不得不回到過程的開始,這並不理想,但鑑於短時間內我們只需要網站不會崩潰並停止銷售。我們如何做到這一點?

任何幫助將非常感激!

回答

0

如果「重載」你的意思是CPU的負荷,這將是與sys_getloadavg(),一個例子很簡單:

$load = sys_getloadavg(); 
$cores = intval(trim(shell_exec('grep physical /proc/cpuinfo | sort -u | wc -l'))); 

if ($load[0] > $cores) 
{ 
    // machine was under heavy load in the last minute 
} 

else if ($load[1] > $cores) 
{ 
    // machine was under heavy load in the last 5 minutes 
} 

else if ($load[2] > $cores) 
{ 
    // machine was under heavy load in the last 15 minutes 
} 

根據您的可用內存,並允許PHP處理你可能想要的數量只是延遲使用usleep()響應幾毫秒,而不是顯示「重負載」消息。要知道,睡覺時,這個過程還在吃你的記憶和Web服務器的線程,所以你必須要小心這一點 - 你可以延遲響應取決於負載,即:

if (($load[1]/$cores) >= 1) 
{ 
    $delay = ($load[1]/$cores)/10; 

    if ($delay >= 0.5) // never delay for more than 0.5 seconds 
    { 
     exit('heavy load sorry'); 
    } 

    usleep($delay * 1000000); 
} 

的負荷越高,延遲越高,這將使CPU有時間趕上所有的工作。

如果您運行的是分佈式負載平衡器,您可能希望將這些值保存在memcached中,同時在APC或類似的地方存儲$cores變量可能會提高性能。

如果您的意思是其他類型的負載(如用戶或內存),則您需要擔心的是獲取相關指標並將其存儲在APC或memcached中,如果您需要分佈式邏輯。

PS:ServerFault可能是一個更好的地方來問這樣的問題。

+0

我認爲這個問題更可能是由於內存不足造成的。我理解你的解決方案,但是它的問題在於它基於PHP,所以每次需要顯示友好的錯誤消息時,它仍然需要將整個框架加載到內存中才能執行php。如果我們遇到繁忙的流量,這不會阻止服務器內存不足。 – Nick

+0

@Nick:在這個階段沒有理由加載整個框架。無論如何,如果您正在尋找PHP應用程序的非PHP解決方案,那麼ServerFault就是您要問的地方。我已投票轉移此問題。 –

+1

啊,我現在明白Alix,我可以把這個邏輯放到應用程序引導程序中,因此不必加載整個框架。這肯定會降低內存需求。乾杯 – Nick