Падение производительности после 5 дней работы веб-приложения, как определить узкое место? - PullRequest
10 голосов
/ 22 августа 2011

Я разработал веб-приложение, используя следующий технический стек:

  • Java
  • Mysql
  • Scala
  • Play Framework
  • интеграция с DavMail (для календаря и сервера обмена)
  • JavaMail
  • Актеры Akka

В первые дни приложение работает плавно и без лагов. Но через 5 дней приложение становится очень медленным! И теперь я понятия не имею, как профилировать это, так как у меня огромные зависимости, и такого рода вещи трудно воспроизвести. Я посмотрел в память, и кажется, что все в порядке.

Есть какие-нибудь указатели по этому вопросу?

Ответы [ 8 ]

10 голосов
/ 22 августа 2011

Попробуйте использовать VisualVM - вы можете отслеживать поведение gc, использование памяти, кучу, потоки, использование процессора и т. Д. Вы можете использовать его для подключения к удаленной виртуальной машине.

7 голосов
/ 22 августа 2011

`visualvm˙ также является отличным инструментом для таких целей, вы также можете подключиться к удаленной JVM и посмотреть, что внутри.

Я предлагаю вам сделать это:

  • сделайте снимок приложения, запущенного за несколько часов и за 5 дней
  • сравните счетчик потоков
  • сравните счетчик объектов, найдите растущие числа
  • узнайте, тратит ли ваша программа больше временив частности, методы на 5-й день, чем на 1-й день
  • проверка на дисковое пространство, возможно, у вас заканчивается
6 голосов
/ 22 августа 2011

jconsole поставляется с JDK и является простым инструментом для выявления узких мест.Подключите его к вашему серверу, посмотрите на использование памяти, время GC, посмотрите, сколько потоков живо, потому что сервер может создать много потоков, и они никогда не завершатся.

4 голосов
/ 22 августа 2011

Я согласен с тульским.Кроме того, вы также можете использовать JMeter, если расследования, проведенные вами с jconsole, неубедительны.

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

3 голосов
/ 22 августа 2011

Для устранения вашей базы данных вы можете отслеживать медленные запросы (и / или запросы, которые не используют индекс), используя медленный журнал запросов см .: http://dev.mysql.com/doc/refman/5.1/en/slow-query-log.html

Я бы рискнул предположить, что у вас отсутствует индекс, и он становится очевидным только по мере увеличения ваших объемов данных.

2 голосов
/ 24 августа 2011

Возможно, вы просто захотите попробовать команду 'play status' , в которой будет указано состояние веб-приложения (потоки, задания и т. Д.). Это может дать вам подсказку о том, что происходит.

2 голосов
/ 22 августа 2011

Еще один профилировщик - Yourkit .
Он коммерческий, но с пробным периодом (две недели).На самом деле, я сначала попробовал VisualVM, как предложил @ axel22, но наш удаленный сервер был ssh'ed, и у нас были проблемы с подключением через VisualVM (не говоря о том, что это невозможно, я просто сдался через несколько часов).

0 голосов
/ 26 августа 2011

Итак, ребята, в данном конкретном случае я запускал play в режиме Developer, что заставляет компилятор работать время от времени.

После перехода в рабочий режим все стало молниеносно и больше никаких проблем,Но спасибо за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...