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
}

根据您的可用内存和允许的 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可能是问这类问题的更好地方。

于 2011-06-27T02:12:41.893 回答