Проблемы производительности Java Webapp - PullRequest
2 голосов
/ 19 января 2012

У меня есть веб-приложение, полностью сделанное на Java.Веб-приложение не использует графическую / модельную инфраструктуру, вместо этого веб-приложение использует контроллер представления модели.Он сделан только со спецификацией Servlet (Servlet ver. 2.4).Веб-приложение разработано с 2001 года и очень сложное.Изначально был построен для работы с Tomcat 4.x / 5.x.На самом деле, работает на Tomcat 6.x.Но у нас все еще есть утечки памяти.

В глубине, спецификации Webapp могут быть возобновлены как:

  • Используется Servlet v. 2.4 Спецификация.
  • Это нене использует Any Framework
  • Он не использует JavaEE (не EJB)
  • Он основан на JavaSE (с сервлетами)
  • Работает только в IE 6+ (из-заэто возраст)

Спецификация инфраструктуры

На самом деле, веб-приложение работает в трех средах:

Первая

  • IBM Server (точно не помню модель)
  • Intel Xeon 2,4 ГГц
  • 32 ГБ ОЗУ
  • 1 ТБ HDD
  • Tomcat (версия 6) настроен на использование 8 ГБ ОЗУ

Второй

  • Сервер Dell
  • Intel Xeon 2,0 ГГц
  • 4 ГБ ОЗУ
  • 500 ГБ HDD
  • Tomcat (версия 5.5) настроен на использование 1,5 ГБ ОЗУ

Третий

  • Сервер Dell
  • Amd Opteron 1214 2,20 ГГц
  • 4 ГБ ОЗУ
  • 320 ГБ HDD
  • Tomcat (версия 6) настроен на использование 1,5 ГБ ОЗУ

Спецификация базы данных

Веб-приложение использует SQL Server 2008 R2 Express Edition в качестве СУБД, за исключением пользователя первой спецификации сервера, которая использует SQL Server 2008 R2 Standard Edition.Для пулов соединений приложение использует Apache DBCP.

Проблема

Что ж, у него очень серьезные проблемы с производительностью.Веб-приложение постоянно замедляется, и часто отказывает в обслуживании.Единственный способ восстановить приложение - перезапустить службу Apache Tomcat.Во время аудита производительности я обнаружил несколько проблем программирования (например, соединения с базой данных, которые никогда не закрываются, чрезмерное использование Vector collection [вместо ArrayList]).

Я хочу знать, как можно улучшить производительность приложениякакие приложения могут помочь мне контролировать производительность Tomcat и использование памяти Webapp.

Все предложения с радостью принимаются.

Ответы [ 5 ]

3 голосов
/ 09 июня 2014

Вы также можете попробовать stagemonitor .Это библиотека для мониторинга производительности с открытым исходным кодом.Он записывает время ответа на запрос, метрики JVM, детали запроса, включая стек вызовов (профиль) вызываемых методов во время запроса и многое другое.Из-за низких накладных расходов вы также можете использовать его в производственном процессе.

Процедура настройки будет следующей.

  • Определение медленных запросов с помощью панели мониторинга запросов request dashboard
  • Анализируйте трассировку стека запроса с помощью Панели сведений о запросе , чтобы узнать о медленных методах
  • Погрузитесь в свой код и попытайтесь оптимизировать эти медленные методы
  • Вы также можете сопоставить некоторые показатели, такие как пропускная способность или количество сеансов, с временем отклика или загрузкой процессора.
  • Анализировать кучу с помощью JVM Memory Dashboard

Примечание.: Я разработчик stagemonitor.

2 голосов
/ 19 января 2012

Я бы начал с некоторых инструментов, которые помогут вам профилировать приложение. Поскольку вы разрабатываете веб-приложение, начните с лямбда-зонд и мелодия Java .

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

  1. Возникают ли проблемы с производительностью сразу после запуска приложений или сверхурочно?
  2. Связаны ли проблемы производительности с количеством клиентских запросов?
  3. В чем реальная проблема производительности - высокая нагрузка на сервер или нехватка памяти (обратите внимание, что они связаны, поэтому проверьте, какой из них запускается первым)
  4. Существуют ли какие-либо фоновые процессы, выполняющие некоторые массивные операции? Они запланированы для запуска в определенный период времени?

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

Как сказал Джошуа Блох в своей книге, озаглавленной «Эффективная Java», проблемы с производительностью редко являются следствием незначительных ошибок в исходном коде (хотя, конечно, неправильное использование конструкций Java может привести к катастрофе). Обычно причиной является плохая системная (API) архитектура.

Последнее предложение, основанное на моем опыте - постарайтесь не думать, что высокое потребление памяти - это что-то плохое. Tomcat будет использовать столько же памяти, сколько и операционная система, и JVM позволит ему (не более максимальных настроек), и только когда ему потребуется больше - Tomcat выполнит сборку мусора. Таким образом, типичный (правильный!) График потребления памяти выглядит как пила. Если вы имеете дело с утечкой памяти, то график будет увеличиваться постоянно, но бесконечно. Это наиболее часто неправильно понимаемая утечка памяти, так что имейте это в виду.

Если честно - мы не можем вам помочь намного дальше. Это всего лишь указатели, теперь вам придется провести обширное исследование, чтобы выяснить причину:)

1 голос
/ 19 января 2012

Общее решение - использовать профилировщик, например YourKit с реалистичной рабочей нагрузкой, которая воспроизводит проблему.

То, что я делаю в первую очередь, это профиль «только ЦП», профиль «только память» и, наконец, профиль «ЦП и память» сразу (затем я смотрю на результаты профиля ЦП)

YourKit также может отслеживать ваши высокоуровневые операции, такие как ресурсы Java EE и соединения JDBC. Я не пробовал это, поскольку я не использую их. ;)

Это может быть хорошей идеей для повышения эффективности, даже если это не является причиной проблемы, так как это уменьшит количество «шума» в этих профилях и сделает ваши проблемы более очевидными.

Вы можете попытаться увеличить объем доступной памяти, но есть подозрение, что это только отсрочит проблему.

0 голосов
/ 17 марта 2014

Вы можете попробовать инструмент с открытым исходным кодом Webapp Watcher , чтобы определить, где в коде проблема с производительностью.

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

0 голосов
/ 19 января 2012

Хорошо. Поэтому я видел, как огромные Java-приложения запускают меньшие конфигурации. Вы должны попытаться сделать следующее -

  1. Сначала подключите Profiler к вашему приложению и посмотрите, какая часть вашего приложения занимает больше всего времени. Вы можете использовать JProfiler или Eclipse MAT (лично я предпочитаю JProfiler). Также попробуйте взглянуть на объекты, занимающие больше всего памяти. Это поможет вам сузить список деталей, которые необходимо переписать для повышения производительности.

  2. После того, как вы посмотрите на утечки памяти, обновите ваше приложение, чтобы использовать 64-битный JDK (при условии, что это уже не так)

  3. Взгляните на свои аргументы JVM и оптимизируйте их.

...