0

PHP ベースの Web アプリケーションがあり、2 日間でトラフィックが急増することが予想されます。

標準の Rackspace LAMP スタック上にセットアップされ、できるだけ多くのサーバーを投入しますが、アプリケーションは非常にメモリとデータベースを集中的に使用するため、最大同時ユーザー数の上限があり、これを超えることはできません。私たちが持っているわずかな時間。

memcached の実装に取り​​組んできましたが、アプリケーションの性質上、効果的に実装することが難しいことがわかっています。

トラフィックは数時間しか続かないと予想されます。私たちの主な関心事は、サイトがクラッシュして販売が停止しないようにすることです。

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

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

単純なアプローチでは、何かを購入しようとしている一部の人々がエラーメッセージを受け取り、プロセスの最初に戻らなければならないことを意味することを私は知っています。これは理想的ではありませんが、短い時間を考えると-frame サイトがクラッシュして販売が停止しないようにする必要があります。どうやってこれを行うのですか?

どんな助けでも大歓迎です!

4

1 に答える 1

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
}

usleep()使用可能なメモリと許可されている PHP プロセスの数によっては、「負荷が高い」メッセージを表示する代わりに、応答を数ミリ秒遅らせたい場合があります。スリープ中もプロセスはメモリと 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は、この種の質問をするのに適した場所かもしれません。

于 2011-06-27T02:12:41.893 に答える