Проблема: Резко изменилась скорость загрузки сайта

Главные вкладки

Аватар пользователя Bzzz Bzzz 3 мая 2016 в 5:54

День добрый!

Три дня попыток решить проблему, пока не привели к результату. Возможно кто-то сможет что-то подсказать, т.к. мыслей, что это может быть почти не осталось. Итак:

Сайт на друпале 7.х + форум на phpBB, между ними связка по пользователям (пользователи беруться из phpBB), но базы разные. Сервер: VPS c 2 Gb памяти.

Симптомы: Никаких работ не проводилось, никаких изменений никуда не вносилось. После добавления статьи (+ картинки) на сайт резко и сильно возросла скорость генерации страницы. Сейчас это выглядит так (до этого было несколько секунд):
Executed 298 queries in 87.21 ms. Queries exceeding 5 ms are highlighted. Page execution time was 60544.24 ms. Memory used at: devel_boot()=0.74 MB, devel_shutdown()=14.34 MB, PHP peak=14.75 MB.

Притом в течении минуты ничего не происходит, потом отдается страница. Нагрузка на процессор околонулевая. Самое занятное, что на форуме то же самое, хотя используются две разные базы.

В процессе решения проблемы было перепробовано и проверено все, от проверки и изменения конфигураций (Nginx, Apache, Mysql, PHP, Drupal) до проверки всех файлов на изменение, включая отключение модуля связки друпала с форумом. Отсутствие результата, но выяснилось следующее: После обращения к сайту, в базе появляется запрос типа
| 559 | YYY_db     | localhost | YYY_db     | Sleep   |   48 |       | NULL             |
И по прошествии 60 секунд исчезает и страница отдается браузеру. Sleep запросы видны в соответствии с запросом страницы сайта или в базе друпала или форума. НО, в админке друпала - все работает нормально, без каких либо проблем и задержек!

На этой VPS есть еще сайт на друпале, но он работает без проблем, скорость отдачи страницы в пределах нескольких секунд, что наводит на мысль, что настройки системы или сервисов скорее всего ни при чем.

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

Комментарии

Аватар пользователя Bzzz Bzzz 3 мая 2016 в 6:04

Спасибо, за подсказку, запуск крона пробовал отключать ранее.
Сейчас отключил крон и Update manager, но ничего не изменилось.

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 3 мая 2016 в 20:19

Хоть в темах по 7-ке не участвую, но похоже тут дело не в друпале, а в системе, так что можно Smile Затраты на запросы еще ни о чем не говорят. Проверь, сколько вообще памяти свободно (top), попробуй почистить кэш (под рутом sync && echo 3 > /proc/sys/vm/drop_caches). Добавь логирования медленных запросов, ограничь время выполнения длинных запросов, время ожидания клиента и т.д. (дока). А может наоборот слишком тяжелые логи? Sleep ловил через processlist? Попробуй также получить количество подключений общее, по пользователям, по хостам. Стопудов где-то утечка ресурсов, т.к. вариант, что кто-то через картинки протащил вредоносный код, а потом так примитивно его использовал - маловероятен.

Аватар пользователя Bzzz Bzzz 4 мая 2016 в 1:22

Большое спасибо всем отозвавшимся!

xdebug - попробую поставить, посмотрим, что покажет.

профайлер для sql - можно чуть подробнее, что имеется в виду?

Адрес http://www.ukrdental.com/ - там кеширование, возможно будет не видно, тогда смотреть http://www.ukrdental.com/forum/ - на форум.

Ресурсов вроде достаточно, top показывает вот так, и еще раз обращу внимание, что на этой VDS есть и другие сайты в том числе и на drupal, сними таких проблем нет:

top - 00:58:50 up 3 days, 20:02,  1 user,  load average: 0.04, 0.02, 0.00
Tasks:  50 total,   1 running,  49 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   2097152k total,  1086064k used,  1011088k free,        0k buffers
Swap:   307200k total,    95452k used,   211748k free,   452312k cached

Вчера включил логгирование медленных запросов и запросы без индекса, сейчас посмотрел, почему-то лог пустой, сейчас буду разбираться, т.к. туда точно должны падать запросы. Остальные логи вроде небольшие в пределах до 100Мб (nginx access, остальные много меньше). Да, словил через processlist, и то случайно когда с мускулом разбирался. Количество подключений одновременных обычно не превосходят 50-ти. Вот сегодня обнаружил, что идет небольшой SYN_SENT flood в пределах 10 запросов (на полноценную DOS атаку не похоже)

Аватар пользователя Bzzz Bzzz 4 мая 2016 в 2:12

vaplas, смешно, но не получается очистить кеш, так что этот пункт не получается выполнить. Видимо на моей VDS мой root не совсем рут, хотя uid 0.

Аватар пользователя Bzzz Bzzz 4 мая 2016 в 2:25

vaplas, забыл сразу написать, относительно времени ограничения и ожидания от Mysql - при изменении со стандартных 60 на 30 сек - в результате только ошибки выполнения запросов в drupal. Общее время генерации страницы - не изменилось.

Аватар пользователя Studio VIZA Studio VIZA 4 мая 2016 в 3:21

Понял что необычайно криво припилен форум. А где проблема хз, я поэтому выношу на внешний и пусть двойная регистрация, но зато всё независимо и работает чисто.

Аватар пользователя Bzzz Bzzz 4 мая 2016 в 3:27

Director-cemetery - да форум сделали криво. Но на самом деле в текущий момент Я могу легко отказаться от этой связки, т.к. вся идея была просто, чтобы была одна регистрация. А на основном сайте пользователи в данный момент все еще не задействованы нормально. модуль этой связи Я отключал, вроде ничего не изменилось.

P.S. Форум был гораздо раньше друпала.

Аватар пользователя Bzzz Bzzz 4 мая 2016 в 5:20

Попробую еще раз отключить, в прошлый раз ничего не дало. Я правда просто отключал модуль, возможно этого не достаточно.

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 4 мая 2016 в 14:09

Director-cemetery wrote:

Понял что необычайно криво припилен форум.

Что прямо-таки "необычайно криво"? И как же это можно понять, не имея даже доступа к коду?

@Bzzz, не ведись на все то, что тут говорят. Пока из всех, кто отвечал (включая меня) знает что говорит только @gor. И если дело критично, то можешь попробовать договориться с его командой о стоимости диагностики. Еще @adubovskoy иногда бывает, он со своей командой тоже может помочь в таких вещах. Ну еще, походу, любой новосибирец подходит. Больше никто. Сорри, если не прав, т.к. слежу только за 8-кой. Основной звездный состав пока на dru.io сидит, так что туда заскочить не повредит.

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

В mysql уже есть профайлер, его не надо устанавливать, а просто включить (http://blog.the_unical.com/databases/mysql/mysql-query-profiler/ - без подчеркивания между the_unical, кстати, еще одно бранное сочетание "e u n"). Примерные действия:

set profiling=1;
set profiling_history_size=100;
show profiles;
show profile for query ID_QUERY;

Но поможет ли? Вроде проблема в том, что после выполнения запроса, он не забирается. Т.е. либо в пхп некорректное обращение, либо апач козлит, а mysql не виноват.

Есть xhprof (и девел вдруг что подскажет):

sudo pear upgrade pear
sudo pecl install -f xhprof
sudo nano /etc/php5/apache2/php.ini
extension=xhprof.so
drupal module:install xhprof
/admin/config/development/xhprof
/admin/reports/xhprof

Можно через SQL Server Profile (вроде в бесплатном Express можно доставить), либо локально развернуть и через Neor Profile SQL.

Не стоит пренебрегать и установкой phpmyadmin, он не такой уж детский, как многие думают. Там есть вкладка "Состояние", в которой доступна и статистика запросов, и визуальный мониторинг, и советчик.

По поводу xdebug-а, знать бы что дебажить, а так в 8-ке сдохнуть можно, если с index.php начинать :). С кастомных модулей, наверное, лучше начать и следить за соединениями с базой.

Вот как-то так Smile

Аватар пользователя Bzzz Bzzz 5 мая 2016 в 6:54

@vaplas Большое спасибо за развернутые ответы. Буду пробовать пока дальше, разбираться. И идеи, что еще посмотреть очень кстати.

Про кривую связку с форумом подтвердил, т.к. это факт и Я с этим уже сталкивался ранее. Xdebug пока поставить не получилось, нужно обновить софт на сервере или ставить более старую версию xdebug, но пока хочу обновить, т.к. это не помешает в любом случае.

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

Из того, о чем говорили ранее, лог медленных запросов работает (проверял), но кроме тестовых запросов он пустой, настроен на запросы более 10 сек.

Отключение/подключение форума пока ничего не дало, возможно отключил не все, что нужно.

Пока к сожалению, чувствую, что вижу только симптомы, и причина проблем пока не видна.

Аватар пользователя dashiwa dashiwa 5 мая 2016 в 14:14

У вас пхп долго отрабатывает. Из первого сообщения видно
Executed 298 queries in 87.21 ms. Queries exceeding 5 ms are highlighted. Page execution time was 60544.24 ms

Аватар пользователя Studio VIZA Studio VIZA 5 мая 2016 в 14:31

Грехи кривой настройки сайта, может отмолить пряморукая настойка сервера.
Феррари (даже с неопытным пилотом), если погрузить в кузов Камаза, легко преодолеет болотистые участки ландшафта.Эзоп 2в днэ

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 5 мая 2016 в 16:27

Есть идея. Зайди в php.ini и поменяй там все значения равные 60 на другие (каждое свое). Только предварительно сделай копию, чтобы потом лего вернуть все на место. Перезапустить и посмотри, с каким из значений совпадет SLEEP. Например:

max_input_time = 22;
mysql.connect_timeout = 33;
mssql.timeout = 44;
default_socket_timeout = 55;

(ну может еще всякие там max_execution_time)

Если max_input_time - то посмотри, может какая операция с файлами подвисает. Если mysql - значит проверь код, который к базе коннектится.
Особенно там, где проверка пользователя идет.

И еще, что какие значения выводят команды:

 /sbin/sysctl net.ipv4.tcp_fin_timeout
 /sbin/sysctl net.ipv4.tcp_synack_retries
 /sbin/sysctl net.ipv4.tcp_keepalive_time
 /sbin/sysctl net.ipv4.tcp_keepalive_probes
Аватар пользователя gor gor 5 мая 2016 в 18:51

еще вариант - перенеси на drupalhosting.ru и там будет в resource usage закладка slow query - в ней можно будет увидеть дебаг медленных запросов - думаю сразу вырисуется модуль что тормозит.

Пример:

Аватар пользователя dashiwa dashiwa 5 мая 2016 в 21:28

Из простого. Методом тыка. Включайте отключайте модули,меняйте темы. И увидите что там тормозит. Самый простой иногда довольно эффектиный способ

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 5 мая 2016 в 21:37

Это правда?! Самый избитый вариант инфекции через тему и картинки? Но как же

Bzzz wrote:

В процессе решения проблемы было перепробовано и проверено все, от проверки и изменения конфигураций (Nginx, Apache, Mysql, PHP, Drupal) до проверки всех файлов на изменение, включая отключение модуля связки друпала с форумом.

Ну зачем, зачем я зашел сюда, ведь знал, что от 7-ки мне добра не будет (((

PS.
И Алексею ты сказал, что была атака, а нам нет. Мэн, так дела не делаются, кстати.

PPS.
В последнее время я какой-то нервный стал, не находите?

Аватар пользователя Studio VIZA Studio VIZA 5 мая 2016 в 22:12

vaplas wrote:

В последнее время я какой-то нервный стал, не находите?

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

Аватар пользователя Bzzz Bzzz 6 мая 2016 в 1:50

Всем большое спасибо! Проблема решилась, как написал vaplas

@gor - Я настроил ранее по совету vaplas логгирование медленных запросов на mysql, и отписывался в теме, там было пусто.

@vaplas атака была на несколько часов до. Вроде обычная DOS, подобные атаки на этом ресурсе бывают довольно часто, не связал эти два события, каюсь. Ибо первый раз такое.

Это иньекция через друпал? Я так понял Вы поэтому грешите на 7-ку?

Аватар пользователя Bzzz Bzzz 6 мая 2016 в 1:52

И в догонку, все даты создания файлов - соответствуют датам остальных файлов в директориях. Делал в первую очередь после появления проблемы проверку всех изменений в файлах за последние несколько дней. Первый раз с таким сталкиваюсь ...

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 6 мая 2016 в 11:16

1-ое, не надо мне выкать, и так звездная болезнь развилась не пофигне
2-ое, грешить на 7-ку и хвалить 8-ку - это моя фишка

Изменить время создания и редактирования файлов - не так уж сложно, спроси любого студента. Проверка на изменение - это прежде всего diff сравнение с бэкапом. Если атаки на сайт обычное дело, посмотри в сторону скриптов обнаружения вредоносного кода (их море), и запускай по крону. 90% вставок идет через тему, т.к. для этого не надо анализировать содержимое файла. Поэтому если бы я не стал пудрить всем голову поиском непонятно чего, то кто-нибудь бы уже давно указал на это. Так что беру всю вину на себя, я говно, Алексей - красавчик. Где брешь - понятия не имею, но раз уж зашла речь, то c twig, который по дефолту в 8-ке такое не прокатывает Smile

Удачи!

PS. Кстати, мой ровно 200 коммент, очень символично, чтобы завязать с.. 7.x-веткой Wink

Аватар пользователя dashiwa dashiwa 6 мая 2016 в 15:38

Пожалуйста ознакомтесь с данным уроком

https://www.youtube.com/watch?v=xAt--Bj9Vak&list=PLrCZzMib1e9qiiSWgZ6pI5...

Его можно смотреть играя в контакте, если пьете чай или что-то там в админке ковыряетесь.

Прошу вас . Это очень полезно
Я думаю что учение свет. Ролики об основах безопасности веб приложения

Аватар пользователя Bzzz Bzzz 6 мая 2016 в 23:48

@vaplas Еще раз спасибо за помощь! В любом случае нет ничего бесполезного. Перенастроил Nginx, Apache, Mysql, PHP под текущую нагрузку на сервер, поставил eAccelerator, так что, что не происходит - все к лучшему. Да и повод задуматься про безопасность.

@dashiwa Спасибо большое за ссылку, обязательно посмотрю.

Аватар пользователя Mihail.space Mihail.space 7 мая 2016 в 16:40

А зачем апач? У php-fpm схожая архитектура с nginx.

Когда вы к апачу фронтендом добавляете nginx, то апач выступая в роли бекенда все равно будет php код пынять дальше своему модулю php в свой бекенд. И получается, что у вас два фронтеда, хотя явно в роли фронтеда выступает всё таки nginx. Но и nginx и апачу и его модулю php нужны ресурсы. Поэтому Nginx + php-fpm всё же более оптимальный вариант получается за счёт того, что nginx лучше апача отдает статику, а php-fpm не хуже апачевского модуля php обрабатывает код php.

Аватар пользователя Studio VIZA Studio VIZA 7 мая 2016 в 16:51

Mihail.space wrote:

У php-fpm схожая архитектура с nginx.

И с Весты, и с ISP, при установке fpm траблы с картинками/чистыми ссылками, на сайтах, пол-года с коллегами периодически воюем с этими проблемами.

Аватар пользователя Mihail.space Mihail.space 7 мая 2016 в 16:53

Тогда извиняюсь. Я с этими манагерами не работал. Весту ставил как то, потом снёс. Но мне для пары бложиков она была и не нужна.