#mysql #mysql-management
#mysql #mysql-управление
Вопрос:
Я внедряю стресс-тест в свое веб-приложение, которое подключается к серверу mysql, и я отслеживаю show processlist mysql.
При высокой нагрузке (ввод-вывод с высокой подкачкой) я получаю много подобных процессов:
| 97535 | db| localhost | userA | Sleep | 515 | | NULL
| 97536 | db| localhost | userA | Sleep | 516 | | NULL
| 97786 | db| localhost | userA | Sleep | 343 | | NULL
| 97889 | db| localhost | userA | Sleep | 310 | | NULL
Но я не могу понять, почему они все еще там и не уничтожены? В конечном итоге это приводит к тому, что мое приложение использует все max_connections и перестает обрабатывать входящие запросы…
Есть идеи, что это за процессы и что они там делают 🙂 ?
Ответ №1:
Это незанятые соединения, удерживаемые клиентом. Вы должны убедиться, что любая клиентская библиотека, которую вы используете (JDBC, …), настроена так, чтобы не поддерживать неиспользуемые соединения открытыми так долго, или что ваше максимальное количество подключений # clients * не слишком велико.
Комментарии:
1. есть ли какая-либо переменная времени ожидания mysql, которую я могу настроить, чтобы избежать этого?
2. Вы можете установить wait_timeout на что-то меньшее ( dev.mysql.com/doc/refman/5.1/en /… ) или увеличьте лимит подключения. Однако вы действительно хотите решить эту проблему на стороне приложения. Прерывание соединения со стороны базы данных может привести к закрытию соединения, как только приложение попытается его использовать, что потенциально может вызвать ошибку приложения без уважительной причины. Какую библиотеку подключения к базе данных вы используете?
3. @KeithRandall но как идентифицировать нулевые процессы?
4. @Khuram: Что вы имеете в виду? Они перечислены в
show processlist
, вы получаете IP-адрес, с которого он подключается, и используемое имя пользователя, если это поможет.
Ответ №2:
Я предполагаю, что вы используете постоянные соединения, например, pconnect в php:
[..] при подключении функция сначала попытается найти (постоянную) ссылку, которая уже открыта с тем же хостом, именем пользователя и паролем. Если один из них найден, вместо открытия нового соединения будет возвращен идентификатор для него
и
[..] соединение с SQL server не будет закрыто после завершения выполнения скрипта. Вместо этого ссылка останется открытой для использования в будущем
У меня была похожая ситуация, и я использовал Codeigniter с включенным pconnect. После выключения (посмотрите, как) каждое соединение было должным образом закрыто после использования, и мой MySQL processlist был пуст.
Производительность: вышесказанное не говорит о производительности, а просто пытается объяснить, почему вы можете видеть много спящих подключений в MySQL. Возможно, с точки зрения производительности это не отрицательно, если соединения остаются активными. Дополнительная информация по адресу: http://www.mysqlperformanceblog.com/2006/11/12/are-php-persistent-connections-evil /