Я нахожусь в ситуации, которая действительно озадачивает меня, и никто, кажется, не знает, в чем проблема.
У меня есть сайт, написанный на php / Laravel, который подключается к серверу mysql. Если я вызываю конечную точку API несколько раз очень быстро (нажимая на кнопку веб-сайта примерно в 10-15 раз очень быстро), в последние несколько раз вызов занимает очень много времени. Когда он обычно длится около 200 мс, он внезапно занимает кратные 30 полных секунд. Таким образом, один вызов занимает 30 секунд, другой (или более) 60, и еще один или несколько вызовов занимает 90 секунд и т. Д. Все вызовы завершаются успешно, но для их завершения требуется огромное время.
Сначала я подумал, что это может быть PHP max_execution_time
, поэтому я установил это на 15. К сожалению, не было никаких изменений; вызов по-прежнему занимает кратные 30 секунд. Плюс, если бы это было проблемой, это возвратило бы ошибку, в то время как в этом случае я получаю правильные 200 ответов.
После некоторого возни я побежал watch -n 0.3 "mysqladmin processlist"
чтобы увидеть, если MySQL был, возможно, причиной. Во время длительных звонков я вижу следующее:
Я не совсем уверен, что это такое и почему это может произойти. Я подумал, что mysql может зависнуть, поэтому я окружил запрос mysql в php системными журналами, чтобы посмотреть, действительно ли код зависает при вызове mysql:
syslog(LOG_ERR, "BEFORE");
$results = TheTable::where('edg', $edg)->get();
$theResponse = response(json_encode($results), 200)->header('Content-Type', 'application/json');
syslog(LOG_ERR, "AFTER");
return $theResponse
Но, похоже, это не так. BEFORE
а также AFTER
Системные журналы всегда появляются сразу после друг друга, даже если я вижу запросы в списке процессов mysqladmin на «sleep».
Кроме того, как вы можете видеть, это очень простой запрос на чтение, поэтому я думаю, что какая-то блокировка mysql не может быть проблемой (потому что я думаю, что блокировки используются только при записи).
И с этого момента я как бы заблудился, как продолжить отладку. Кто-нибудь знает, что эти результаты говорят мне и где я могу найти решение этой проблемы? Все советы приветствуются!
[PS: немного больше информации о настройке] Настройка немного сложнее, чем я описал выше, но, поскольку я не думаю, что это как-то связано с этим, я сохранил эту информацию для последнего. На самом деле у нас есть два сервера Ubuntu 16.04 с балансировщиком нагрузки перед ними. Оба сервера содержат сервер MySQL, который находится в каком-либо режиме синхронизации master / master. Хотя я чувствую себя очень комфортно в Linux, я не настроил это, и я не являюсь системным администратором, поэтому я мог что-то там упустить. Я спросил парней, которые управляют этой установкой, но они говорят, что проблема должна быть в коде. Я не уверен, где это может быть, хотя.Снова; все советы приветствуются!
Задача ещё не решена.
Других решений пока нет …