Может ли непослушное приложение базы данных аварийно завершить работу tomcat?

У нас есть несколько веб-сервисов, работающих через Tomcat, которые используют hibernate/mysql. Я подозреваю, что у некоторых из них неправильно настроены пулы соединений, так как через несколько часов у некоторых приложений заканчиваются соединения и они перестают отвечать. Мы вносили изменения в службу пула соединений (в данном случае, C3P0), но нам все еще нужно оставить старые версии приложений на сервере для обратной совместимости.

В любом случае, я подозреваю, что эти приложения также наносят ущерб общей стабильности tomcat. Примерно раз в неделю наш сервер перестает отвечать на запросы полностью и не может обслуживать даже статические страницы. После перезапуска службы все работает снова еще несколько дней или около того. Просматривая логи, вы обнаружите едва ли какие-нибудь необъяснимые исключения, поэтому я не уверен, что может привести к падению tomcat. К сожалению, в журналах ошибок нет ничего примечательного, прежде чем сервер перестает отвечать.

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

Конфигурация сервера: Windows 2003 Server, Tomcat 6.0.18 + blazeDS 3.0, Hibernate 3.2.

4 ответа

Решение

Я не думаю, что у кого-то будет ответ на вашу проблему, а только уроки и идеи. Вот некоторые:

  • вам нужны роботы, которые будут проверять работоспособность каждой части вашего сервиса. (тестирование одного соединения с вашей базой данных, получение статической веб-страницы, получение динамической веб-страницы...). Таким образом, вы увидите, что сломается первым или увеличится время отклика.

  • у вас есть служба мониторинга / статистики? Необходимо отслеживать "количество активных подключений к базе данных", "количество активных веб-сеансов", "количество потоков Tomcat", "доступная память", процессор...

Мой совет, процесс tomcat не остался, потому что все они застряли в ожидании ресурса (возможно, соединение с базой данных, или они просто бесконечный цикл!). Инструменты, которые я перечислил ранее, определенно помогут вам понять, почему ваш сервер медленно умирает каждую неделю.

  1. бежать netstat на вашем сервере и посмотрите количество подключений к серверу базы данных (и сравните его с размером вашего пула и мощностью сервера базы данных).
  2. запустите jstack на сервере приложений и отрежьте /grep/sort их, чтобы увидеть, что делают ваши потоки.

Если вы установите веб-приложение с лямбда-зондом (получите бета-версию 1.7), вы сможете получить мониторинг уровня потока; следя за этим, вы узнаете, когда потоки зависнут, ожидая базу данных, а также множество других полезных средств диагностики.

Это немного старый, но все еще отлично работает в последних выпусках tomcat.

Хотелось бы добавить, что проблемы блокировки таблиц с таблицами MyISAM довольно распространены, и это может привести к тому, что соединения с БД будут накапливаться и заставлять приложение ждать этих результатов.

Вы можете проверить список процессов MySQL, чтобы увидеть, есть ли много запросов, находящихся в заблокированном состоянии.

# mysqladmin processlist

-- или же --

mysql> show processlist;

Если проблема заключается в блокировке, вы захотите узнать, возможно ли изменение механизма хранения в таблицах проблем с MyISAM на InnoDB.

Если для обслуживания статических страниц не требуется доступ к базе данных, маловероятно, что это проблема ресурса базы данных как таковая. Возможно, что все объединенные потоки где-то застряли, например, в ожидании диска базы данных или в тупике. Первое, что я хотел бы сделать, это получить снимок трассировки стека с jstack, Вы можете дополнительно посмотреть на процесс с visualvm или же jconsole,

Другие вопросы по тегам