Отладка MySql Удалил ошибки, случайно получив несколько спящих потоков - PullRequest
0 голосов
/ 03 декабря 2018

Начнем с самой проблемы: на моем сервере случайно возникают проблемы, при которых страницы перестают загружаться на несколько минут (часто до 300 секунд) или загружаются крайне медленно.Это не обязательно коррелирует с увеличением трафика, но, скорее всего, произойдет, когда оно увеличится.Иногда я могу просто бездельничать, что-то замедляется в течение пары минут, а затем все возвращается в нормальное русло, те же файлы обрабатываются.Сама система очень проста: она не делает ничего, кроме базовой вставки и чтения данных, ни одна таблица не содержит более пары тысяч строк.Google Analytics показывает пик одновременного доступа около 300 в час в часы пик.

Это старый проект, который недавно пришел в нашу компанию.Код PHP очень старый, и я потратил много времени на рефакторинг запросов, чтобы использовать централизованное соединение PDO поверх mysql_connect, прежде чем каждый раз. Однако на старом сервере этих проблем не было, только на новом.

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

Дело в том, что нет никакого конкретного файла или сценария, вызывающего это.Так как теперь у меня есть управление WHM, я вижу, что нет проблем с использованием памяти или процессора.Медленный запрос журнала пуст, установите 20 секунд для входа.Что происходит, так это то, что все работает очень медленно, а затем легко возвращается к нормальной жизни.

Ошибки, которые я вижу в журнале, - это MySql Gone, или другие, например

AH01071: Got error 'Primary script unknown

или

(70007)The timeout specified has expired: [client IP] AH01075: Error dispatching request to : (polling) (Timeout is set at 300 seconds, nothing should take more than a couple to run).

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

SELECT *, 
    COUNT(DISTINCT(command_type)) as conta, 
    MIN(event_time) as inicio, 
    MAX(event_time) as fim, 
    timediff(MAX(event_time),MIN(event_time)) as diferenca 
FROM `general_log` 
WHERE user_host LIKE '%hostname%' 
GROUP BY thread_id HAVING diferenca > "00:01:00"

И он показывает пару результатов, один из которых, как я знаю, соответствует фактической медлительности.Что еще интереснее, последняя команда перед замедлением - это select

SELECT * FROM publicidade WHERE secao = 1 ORDER BY posicao ASC, data_insercao DESC LIMIT 2

Дело в том, что этот выбор всегда выполняется быстро, в таблице с 29 строками, возвращающей 1 результат.Не имеет смысла, чтобы это все испортило, но это всегда последняя показанная команда запроса, даже было найдено 2 ситуации, когда поток так и не добрался до QUIT.

Так что на данный момент я в тупике.Проблемы продолжают происходить, они преходящие, приходят и уходят без видимой причины, и я не могу понять, почему.Журнал slow_queries пуст, поэтому он не похож на зависший запрос, он просто засыпает после этого запроса до истечения времени ожидания, никаких дальнейших ошибок PHP, ничего.И через несколько минут те же сценарии работают нормально, как будто ничего не произошло.Я даже мог видеть ситуации, когда www / non www имеют разные результаты (одно хорошо, другое нет), а также прямой доступ через IP.

Как мне отладить происходящее? В чем может быть причина?

Кстати, постоянные соединения отключены.

1 Ответ

0 голосов
/ 04 декабря 2018

К сожалению, просто недостаточно информации, чтобы порекомендовать что-нибудь полезное.

  • Вы проверили серверный ввод / вывод?
  • Вам следует проверить, нет ли проблем с обратным поиском, еслиВы проверяли разрешение пользователя mysql «на домен» (вы можете попробовать переключиться на «на IP»)
  • Вы можете попробовать MySQLTuner-perl , это может дать вам некоторые пропущенные подсказки.
  • Вы можете попробовать использовать инструменты webyog (пробная версия).Это также может дать вам некоторые подсказки.
...