2011-06-27 10 views
0

私たちはPHPベースのWebアプリケーションを使用しており、2日間でトラフィックの急増が予想されます。サイトの停止を防ぐフレンドリーなトラフィックスパイクメッセージの作成

私たちは標準的なRackspace LAMPスタックにセットアップされており、できるだけ多くのサーバーを投げますが、アプリケーションは非常にメモリとdb集中的ですので、最大並列ユーザーの上限はありません私たちが持っている時間のほんの少しを与えてください。

私たちはmemcachedの実装に取り​​組んでいますが、アプリケーションの性質上、効果的に行うことは困難です。

トラフィックは数時間しか持続しないことが予想され、主な関心事は、サイトがクラッシュせず、販売が停止することです。

「大量のトラフィックが発生して申し訳ありませんが、もう一度お試しください。」というエラーメッセージを表示する最も簡単な方法は何ですか?サーバーの負荷が高すぎる場合

このようにして、適切なWebアプリケーションを提供してから、リクエストキューがいっぱいになると、単純な静的なフレンドリなhtmlトラフィックメッセージを送信できます。

私は素朴なアプローチで、何かを買おうとしている人たちがエラーメッセージを受け取って、理想的ではないプロセスの始めに戻らなければならないかもしれないことを知っています。短い時間枠を与えられただけで、クラッシュして販売を停止しないようにサイトを必要としています。これをどうやってやるの?

ご協力いただければ幸いです。

答えて

0

「高負荷」あなたは、これは、例えばsys_getloadavg()と非常に簡単になり、CPUの負荷を意味したか:

$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に保存したい場合や、$cores変数をAPCなどに保存すると、パフォーマンスが向上する可能性があります。

他の種類の負荷(ユーザーやメモリなど)を意味する場合は、ロジックが似ています。分散ロジックが必要な場合は、関連するメトリックを取得してAPCまたはmemcachedに保存するだけです。

PS:ServerFaultこのような質問をするのが良いかもしれません。

+0

私はその問題がメモリ不足に起因する可能性が高いと思います。私はあなたが解決策を理解していますが、問題はphpに基づいているため、フレンドリーなエラーメッセージを表示する必要があるたびに、PHPを実行できるようにするために、フレームワーク全体をメモリにロードする必要があります。トラフィックが多い場合、サーバーのメモリが不足することはありません。 – Nick

+0

@ニック:この段階でフレームワーク全体を読み込む理由はありません。とにかく、PHPアプリケーションのためのPHP以外のソリューションを探しているなら、ServerFaultが尋ねる場所です。私はこの質問を移行するために投票しました。 –

+1

ああ、私は今、Alixと理解しています。私はこのロジックをアプリケーションのブートストラップに入れて、フレームワーク全体をロードする必要はありません。これは確かにメモリ要件を低下させるでしょう。乾杯 – Nick

関連する問題