Создание дружественных сообщений о всплесках трафика, которые останавливают смерть сайта - PullRequest
0 голосов
/ 27 июня 2011

У нас есть веб-приложение на основе php, и мы ожидаем значительный всплеск трафика через 2 дня.

Мы настроены на стандартный стек Lack Rackspace и будем использовать столько серверов, сколько сможем, ноприложение занимает довольно много памяти и требует большого количества дБ, поэтому будет некоторое ограничение максимального числа одновременных пользователей, которое мы не сможем превысить, учитывая небольшое количество времени, которое у нас есть.

Мы работали над реализацией memcached, но из-зав силу характера приложения, его оказалось трудно сделать эффективно.

Ожидается, что трафик будет длиться всего пару часов, и наша главная проблема в том, что сайт не рухнет, что приведет к увеличению продаж.привал.

Какой самый простой способ отобразить сообщение об ошибке: «Извините, у нас интенсивный трафик, пожалуйста, повторите попытку в ближайшее время».Когда серверы испытывают слишком большую нагрузку?

Таким образом, мы могли бы обслуживать наше надлежащее веб-приложение, а затем, когда очередь запросов начинает заполняться, тогда мы можем просто отправить простое статичное дружественное HTML-сообщение о трафике.

Я знаю, что при наивном подходе это будет означать, что некоторые люди, которые просто собираются что-то купить, получат сообщение об ошибке, а затем, возможно, придется вернуться к началу процесса, что не идеально, ноучитывая короткие сроки, нам просто нужно, чтобы сайт не падал и не останавливал продажи.Как мы можем это сделать?

Любая помощь будет с благодарностью!

1 Ответ

0 голосов
/ 27 июня 2011

Если под «большой нагрузкой» вы подразумеваете нагрузку на процессор, это будет довольно просто с 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() вместо отображения сообщения «под большой нагрузкой». Имейте в виду, что во время сна процесс все еще потребляет потоки памяти и веб-сервера, поэтому вам следует быть осторожным с этим - вы можете отложить ответ в зависимости от нагрузки, т. Е .:

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);
}

Чем выше нагрузка, тем выше задержка, это даст процессору время справиться со всей работой.

Если вы используете распределенный балансировщик нагрузки, возможно, вы захотите сохранить эти значения в memcached, также сохраняя переменную $cores в APC или аналогичном, вероятно, вы получите повышение производительности.

Если вы имели в виду другой вид нагрузки (например, пользователи или память), логика похожа, все, о чем вам нужно беспокоиться, это получить соответствующую метрику и сохранить ее либо на APC, либо в memcached, если вам нужна распределенная логика.

PS: ServerFault может быть лучшим местом, чтобы задавать подобные вопросы.

...