БлогNot. Странная проблема с не менее странным решением...

Странная проблема с не менее странным решением...

В пятницу (точней, ещё в четверг) попросили помочь с сайтом, нагрузка на который, в смысле используемого процессорного ресурса, за небольшой период времени выросла в несколько раз, достигнув критичных для хостера значений в 10-12% на одно ядро CPU. При этом у хостера написано:

Важно: Нормальной/штатной нагрузкой на CPU считается нагрузка в 3% и менее, если на графике вы наблюдаете постоянную нагрузку в 3% и более это серьезная причина для оптимизации скриптов вашего аккаунта.
Важно: Долговременная (более суток) нагрузка на CPU более 5% может привести к блокировке вашего аккаунта со стороны хостинг провайдера за нагрузку на сервер.

В файлах access_log и error_log ничего необычного не нашёл, "Метрика" показывала абсолютно обычное число посетителей, все параметры встроенной статистики хостера тоже были в норме.

Значит, деваться некуда, надо лезть в код. Вот список выполненных работ:

1. Тупо сделал ссылки в шаблоне, подключающем верх и низ всех страниц сайта, абсолютными, то есть, http://www.myurl.com/page.php вместо page.php или /page.php.

2. Кроме того, вывод "шапки" и "подвала" был сделан обычным HTML, но разметка лежала в файле с расширением PHP. Заменил выводом через echo, то есть

<?php
 echo '<html> ... </html>';
?>

вместо

<html> ... </html>

3. Поменял в коде часто используемый редирект примерно с

header('Location: index.php');

на

header('Location: '.get_server_url().'index.php');

где get_server_url() занимается понятно чем, беря данные из $_SERVER, как-то вот так по-простому:

function get_server_url () {
 $s='http://'.$_SERVER['SERVER_NAME'].$_SERVER['SCRIPT_NAME'];
 $sb=strrchr($s,"/");
 if ($sb!==false) $s=substr($s,0,-(strlen($sb)-1));
 return $s;
}

4. Сделал обработку типовых ошибок Apache 403, 404, 500 как в этой заметке.

5. Убрал сбор статистики об одновременно присутствующих юзерах, бывший вот в таком стиле. Просто не стоит при каждой загрузке страницы заново лопатить всю папку temp на серваке. Вообще, нормальной способ сбора такой статистики я вижу один - хранить сессии в базе и выводить запросом, без session_start и подобного. Кстати, в этом блоге такую статистику тоже отключил на всякий случай :)

6. Сессия стартует, только если нужна:

if (!session_id()) session_start ();

вместо

session_start();

Вообще, вопрос, нормально ли для каждого юзера запускать сессию - спорный. При небольшой и средней нагрузке на сайт точно ничего страшного не произойдёт. При большой, возможно, лучше также хранить сессию в базе, не забывая о том, что база также предполагает обращения к диску и использование процессорного времени :)

Ну и закачал изменённые файлы на сайт, базу и проч. не трогал. Результат превзошёл самые светлые ожидания - нагрузка уменьшилась в 50-100 раз - с 10-12% до 0.1-0.2%! С тех пор таковой и остаётся:

Изменение статистики после работ
Изменение статистики после работ
Статистика за неделю через сутки с лишним после изменений
Статистика за неделю через сутки с лишним после изменений

Посетители по "Метрике" при этом не уменьшились, число дисковых операций на сервере тоже заметно не изменилось. Что могло дать такой эффект? - ломаю голову 2 дня. Теоретически, п. 5 - но фокус в том, что я сделал его за день до остальных изменений и он не помог! Да и у меня в блоге подобное, вроде, работало стабильно.

Нанотехнологии, да и только :) Чегой-то важного я не учитываю по PHP :( А может быть, какой-то файл на хостинге из обновлённых просто был с "левым" внедрённым кодом?.. но это маловероятно, было всё в порядке с правами.

22.02.2015, 19:58 [9658 просмотров]


теги: статистика ошибка php сервер

К этой статье пока нет комментариев, Ваш будет первым