【问题标题】:Creating friendly traffic spike messages that stop site death创建阻止站点死亡的友好流量峰值消息
【发布时间】:2011-06-27 10:17:41
【问题描述】:

我们有一个基于 php 的 Web 应用程序,预计 2 天内流量会大幅飙升。

我们设置在标准的 Rackspace LAMP 堆栈上,并将尽可能多地向其投放服务器,但该应用程序占用大量内存和数据库,因此我们将无法达到最大并发用户数的上限鉴于我们所拥有的时间不多。

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

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

显示错误消息“抱歉,我们遇到交通拥堵,请稍后重试”的最简单方法是什么?当服务器负载过重时?

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

我知道,如果采用幼稚的方法,这将意味着一些刚要买东西的人会收到错误消息,然后可能不得不回到流程的开始,这并不理想,但鉴于在很短的时间内,我们只需要网站不要崩溃和停止销售。我们如何做到这一点?

任何帮助将不胜感激!

【问题讨论】:

    标签: php apache hosting cloud traffic


    【解决方案1】:

    如果“重负载”是指 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 可能是提出此类问题的更好地方。

    【讨论】:

    • 我认为问题更有可能是由于内存不足造成的。我了解您的解决方案,但是问题在于它基于 php,因此每次需要显示友好的错误消息时,它仍然需要将整个框架加载到内存中才能执行 php。如果我们遇到大量流量,这不会阻止服务器内存不足。
    • @Nick:现阶段没有理由加载整个框架。无论如何,如果您正在为 PHP 应用程序寻找非 PHP 解决方案,ServerFault 就是您要问的地方。我已投票决定迁移此问题。
    • 啊,是的,我现在明白了 Alix,我可以将此逻辑放入应用程序引导程序中,从而不必加载整个框架。这肯定会降低内存要求。干杯
    猜你喜欢
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    相关资源
    最近更新 更多