创建友好的流量峰值消息,以阻止站点死亡

时间:2011-06-27 01:08:18

标签: php apache hosting cloud traffic

我们有一个基于PHP的网络应用程序,预计2天内流量会大幅增加。

我们设置在一个标准的Rackspace LAMP堆栈上,尽可能多地投入服务器,但应用程序是内存和数据库密集型的,所以我们将无法实现最大并发用户的上限考虑到我们拥有的少量时间,我们已经超过了。

我们一直在努力实现memcached,但由于应用程序的性质,它很难有效地完成。

流量预计只会持续几个小时,我们主要担心的是网站不会崩溃,导致销售停滞不前。

显示错误消息的最简单方法是“抱歉我们遇到了大量流量,请尽快重试”。当服务器负载太重时?

通过这种方式,我们可以提供正确的Web应用程序,然后当请求队列开始填满时,我们就可以提供简单的静态友好html流量消息。

我知道,通过一种天真的方式,这意味着一些即将购买东西的人会得到错误信息然后可能不得不回到过程的开始,这不是理想的,但是给出了短暂的时间框架我们只需要网站不会崩溃并停止销售。我们怎么做?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分: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可能是提出这类问题的更好地方。