SQL-запрос перегружает сервер

SQL-запрос перегружает сервер

У меня есть один php-файл, который вызывается очень часто для проверки сеанса внешнего приложения. Я не знаю, сколько вызовов происходит каждую секунду, но я думаю, что это может быть около 20-100 вызовов каждую секунду.

Однако этот файл .php включает один SQL-запрос, который обновляет одну строку. Если я не перекомментирую эти строки, вся база данных сильно замедляется, и в конце концов мой форум больше недоступен. Я думаю, что это что-то вроде проблемы с сервером (например, слишком много IOPS?). К сожалению, я не знаю, как найти точную причину замедления, и не знаю, как определить, сколько вызовов я получаю каждую секунду для файла php.

Это очень простой SQL-запрос (предложение where содержит только первичный ключ):

UPDATE bot_sessions SET ip_address = :ip_address, renewal_count = renewal_count + 1
       WHERE username = :username AND session_token = :session_token

Итак, два вопроса:

  1. Как узнать, как часто мой PHP-файл вызывается каждую секунду?
  2. Как мне найти причину замедления работы всей моей базы данных после использования этого запроса на обновление?

решение1

Вы должны быть в состоянии узнать, как часто вызывается определенный файл PHP, просматривая журналы веб-сервера. Есть еще несколько хаков - например, использование Google Analytics (что будет менее точным) или обновление файла/счетчика (более ресурсоемко).

Как сказал @ma.tome, мониторинг использования дает вам хорошую отправную точку и, как правило, полезен. Процесс Mysql, работающий на 135%, означает, что он использует более 1 ЦП. (Если у вас 4 ЦП, то общее количество составляет 400%). Запуск vmstat предоставит вам информацию о вводе-выводе.

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

Кроме того, в вашей системе может просто заканчиваться оперативная память. Посмотрите, сколько подкачки вы используете, и, если необходимо, увеличьте объем оперативной памяти для решения проблемы или уменьшите vm.swappiness.

Связанный контент