Рейтинг:1

Почему наше Java-приложение Tomcat внезапно открывает сотни соединений с нашей базой данных?

флаг it

У нас есть приложение Tomcat, работающее на Elastic Beanstalk, и наша база данных MySQL размещена на AWS RDS (2 или 3 экземпляра t3.medium). С тех пор, как мы обновились с MySQL 5 до MySQL 8 (в настоящее время 8.0.23), у нас возникла проблема, возникающая примерно раз в неделю.В большинстве случаев с базой данных все в порядке, но затем, внезапно, количество подключений резко возрастает (иногда даже превышает лимит в 307 подключений за 1-минутный диапазон, чего мы также не получаем). он может выйти за этот предел?), и это приводит к деградации экземпляров Elastic Beanstalk. Иногда вся база данных дает сбой после этих пиковых подключений.

Наблюдая за JVM приложения с помощью VisualVM, я заметил, что во время этих пиковых подключений Tomcat внезапно создает десятки рабочих потоков. Я предполагаю, что каждый из этих потоков устанавливает новое соединение с базой данных. Хотя мы могли бы ограничить количество этих потоков (в конце концов, серверы не смогли бы обрабатывать такое количество потоков), мы хотим понять, чем это вызвано. Почему Tomcat создает так много потоков и соединений с нашей базой данных? Является ли это причиной или следствием проблем в базе данных? Где мы должны искать, чтобы найти корень проблемы?

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

Wilson Hauck avatar
флаг jp
Проходит ли спайк через какое-то время - как долго? Как вернуть систему в рабочее состояние?
Helder Sérvio avatar
флаг it
@WilsonHauck, когда происходит всплеск, проверки работоспособности балансировщика нагрузки начинают давать сбой, из-за чего Elastic Beanstalk отключает экземпляры и заменяет их, что, в свою очередь, решает проблему.
Рейтинг:1
флаг ua

Где мы должны искать, чтобы найти корень проблемы?

  • Включите slowlog в MySQL и (после всплеска) исследуйте, какие запросы выполнялись в это время. Если медленный журнал мало что показывает, уменьшите long_query_time до следующего пика.
  • (Я не знаю, есть ли у Tomcat журнал.)
  • Это происходит в одно и то же время каждый день или неделю?
  • Когда Amazon делает резервные копии?
  • Если вы в сети, когда это произойдет, посмотрите, сможете ли вы сделать ПОКАЗАТЬ СПИСОК ПРОЦЕССОВ;. Держите себя на связи; может быть трудно подключиться, когда вы видите всплеск.
  • MySQL «ПЕРЕМЕННАЯ» max_connections контролирует 307. Его увеличение может отсрочить вершину всплеска, но усугубит ситуацию. (Я не вижу в этом «решения».)
  • Tomcat может [вероятно] удерживать лишние соединения, не причиняя особого вреда; скорее всего, будет лучше ограничить Tomcat, чем изменить 307. Когда MySQL имеет «много занятых соединений», он предоставляет каждому равный доступ к ресурсам; это имеет эффект замедления все соединения.
Helder Sérvio avatar
флаг it
Мы уже рассмотрели журнал медленных запросов и смогли удалить/рефакторить несколько дорогостоящих запросов на полный рабочий день, когда ситуация была действительно ужасной (постоянный сбой БД), но тем не менее это не объясняет, почему проблема начала происходить только после перехода на MySQL 8. У Tomcat есть журнал, но мы не сохраняем его после уничтожения экземпляров. Мы сделаем это в следующий раз и посмотрим на темы. И нет, это сильно различается по частоте и времени. Не пересекается с резервными копиями.
Wilson Hauck avatar
флаг jp
@HelderSérvio Пожалуйста, запросите дополнительную информацию. Тип экземпляра AWS — размер ОЗУ, количество ядер, любые устройства SSD или NVME на хост-сервере MySQL? Опубликуйте на pastebin.com и поделитесь ссылками. Из вашего корня входа SSH, текстовые результаты: A) ВЫБРАТЬ COUNT(*) FROM information_schema.tables; B) ПОКАЗАТЬ ГЛОБАЛЬНЫЙ СТАТУС; минимум через 24 часа UPTIME C) ПОКАЗАТЬ ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ; D) ПОКАЗАТЬ ПОЛНЫЙ СПИСОК ПРОЦЕССОВ; д) СТАТУС; не ПОКАЗАТЬ СТАТУС, просто СТАТУС; для анализа настройки рабочей нагрузки сервера, чтобы предоставить предложения.
Helder Sérvio avatar
флаг it
@УилсонХаук. Серверы представляют собой 2-3 экземпляра t4g.small (2 ГиБ, 2 виртуальных ЦП), а база данных (одна, я ошибся, когда сказал, что 2-3) экземпляра t3.medium (4 ГиБ, 2 виртуальных ЦП), с SSD gp2. У меня нет прямого доступа к базе данных, поэтому я не могу показать вам результат этих запросов.Однако мой босс дал мне дамп таблицы медленных запросов. По сути, происходит следующее: в определенный момент все запросы начинают замедляться (плотность медленных запросов сильно возрастает), пока некоторые не достигают 2-3 минут. Статистика производительности RDS показывает, что LOCK_table_cache долго ожидает.
Wilson Hauck avatar
флаг jp
@HelderSérvio Не могли бы вы опубликовать информацию о медленных запросах, предоставленную вашим боссом? Не мог бы ваш начальник запустить вышеперечисленное, опубликовать данные на pastebin.com, а вы поделитесь с нами ссылками для анализа рабочей нагрузки вашего экземпляра t3.medium?
флаг ua
«Плотность увеличивается» — часто один запрос ускоряет скопление. `SHOW PROCESSLIST` иногда может это заметить, но получить это сложно. Необработанный медленный журнал иногда может показать, какой запрос является непослушным запросом. («Переваривание» запроса лучше для выяснения того, какой запрос является наибольшей нагрузкой для системы.)

Ответить или комментировать

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