Сервлет Профилирование - PullRequest
5 голосов
/ 12 марта 2010

Как лучше всего выполнить профилирование сервлета?

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

Я запускаю сервлет в среде Tomcat.

Я пробовал VisualVM, но он позволяет мне видеть только вызовы методов из потока Tomcat, а не сами сервлеты.

Ответы [ 4 ]

3 голосов
/ 31 июля 2012

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

Так работают фильтры

  • URL называется
  • Фильтр входит и сохраняет URL-адрес и текущее время (startTime)
  • Фильтр вызывает сервлет (-ы) назначения
  • Выполняется сервлет (сервлет, страница или jsp)
  • Элемент управления возвращается к времени выполнения фильтра: currentTime - startTime
  • Записать или сохранить данные, полученные для будущего сравнения (т.е. сохранить их в CSV-файл)
  • Фильтр заканчивается

Для этого создайте класс, который реализует интерфейс javax.servlet.Filter.

public class ProfilingFilter implements Filter {
  public void init(FilterConfig fc){}
  public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain){
    long startTime = System.currentTimeInMillis();
    String servletName = ((HttpServletRequest) req)..getPathInfo();
    chain.doFilter(req, resp);
    long executionTime = System.currentTimeInMillis()-startTime;
    // Implement the following to store or handle the data.
    logData(servletName, executionTime);
  }
}

Теперь добавьте его в свой web.xml

<filter>
  <filter-name>profilingFilter</filter-name>
  <filter-class>com.awesome.ProfilingFilter</filter-class>
</filter>

И, наконец, отображение:

<filter-mapping>
  <filter-name>profilingFilter</filter-name>
  <url-pattern>*</url-pattern>
</filter-mapping>

Имейте в виду, что это отфильтрует ВСЕ, так что вы будете профилировать, html, jsp, сервлеты, изображения, а что нет.

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

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

Некоторые идеи: сохраните свою статистику на карте в контексте сервлета, а затем попросите другой сервлет отобразить эту статистику. таким образом, вам даже не нужен доступ к диску.

2 голосов
/ 12 марта 2010

Я использовал JProfiler для профилирования, они поддерживают множество различных серверов и дают очень хороший контроль и хорошие отчеты. Однако это коммерческое приложение, хотя вы можете получить ознакомительную версию. Вы также можете взглянуть на профилировщиков с открытым исходным кодом , хотя я не использовал ни одного из них и не могу сказать, насколько они хороши или плохи.

Редактировать Я предполагаю, что вы понимаете, как работает профилирование, профилировщик будет выполнять некоторые инструментарии и подключать агент к JVM, все это влияет на производительность. Поэтому никогда не используйте его в производственной среде.

1 голос
/ 06 марта 2015

2015. Начиная с JDK 7u60 (если я правильно понял) в jvm есть встроенный инструмент для профилирования java-приложений. Говорят, что он очень легкий - около 1% потребления процессора. Это называется Java Flight Recorder. Чтобы включить его, вам нужна версия jdk от 7u60 и запустить приложение со следующими флагами.

-XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=duration=60s,filename=myrecording.jfr

Здесь duration=60s устанавливает продолжительность профилирования (задайте столько, сколько вам нужно), а filename=myrecording.jfr устанавливает файл, в который будет сохраняться информация профилирования.

Затем вы можете просмотреть файл, используя java control control.

Видео здесь

Документы здесь

1 голос
/ 12 марта 2010

Почему бы вам не использовать JConsole - который предоставляет MBeans . Ваше контейнерное приложение, вероятно, предоставит некоторые полезные поля, относящиеся к вашему сервлету, и если это не так, вы можете создать свои собственные MBeans.

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