Deutsche Bank Group Technology & Operations Непрерывное профилирование в ходе эксплуатации для Java приложений Алексей Рагозин Deutsche Bank Профилирование даёт нам богатейший набор инструментов •Широкий выбор профайлеров •Диагностические интерфейсы ✓ инструментация итд Но есть небольшая проблема… Deutsche Bank Профилирование Как воспроизвести проблему в условиях эксперимента? Нам нужно •Реальное железо •Реальные данные •Реальная нагрузка Deutsche Bank Плюс, очень чёткое понимание того что же именно происходит в ходе эксплуатации! Что же всё-таки наше приложение делает на самом деле? Можно спросить • нам не ответят соврут Можно замерить … Deutsche Bank Метрики Deutsche Bank Метрики Замеряем / Агрегируем / Публикуем • • • • • … Deutsche Bank Метрики Dev Vs. Ops Deutsche Bank Метрики Мониторинг Профилирование Deutsche Bank Телеметрия Результаты прямых измерений Не агрегированные Пригодные для статистической обработки Включая •замеры специфические для приложения •общее состояние системы ЦПУ сеть и т п Данные обрабатываются ретроспективно Deutsche Bank Телеметрия Big data? ▪ Текстовая строчка лога байт ▪ Бинарно упакованная строчка байт ✓ Сжимается в ▪ раза миллионов событий в день это много ✓ в день Deutsche Bank Работа с данными Время отклика Deutsche Bank Работа с данными Частота запросов Deutsche Bank Работа с данными Время отклика от частоты Deutsche Bank Работа с данными Deutsche Bank Threads: 16 Threads: 8 Threads: 4 Default stride size Deutsche Bank Stride: 4096 Threads: 16 Threads: 8 Threads: 4 Default stride size Deutsche Bank Stride: 4096 Работа с данными Deutsche Bank Работа с данными •меньше 1000 строк •пивот таблицы • Интерактивная работа с данными •любые объёмы данных •сложные расчёты • предагрегация • автоматизация •QQ диаграммы •cтатистичекие “навороты” Deutsche Bank Профилирование Deutsche Bank Профилирование Инструментация (“логи”) ▪ Правильный выбор точек замеров ▪ Крупная гранулярность Сэмплирование ▪ Не требует конфигурации ▪ Проблемы выявляют себя сами Deutsche Bank Профилирование Сэмплирование JVM использует safepoint для получения дампа потоков ▪ Нагрузка на ▪ Особенности расстанови ов Сэмплер стек трейсов не использующий safepoint`ы https://github.com/RichardWarburton/honest-profiler Deutsche Bank Профилирование Сэмплирование стектрейс не значит ничего Набор стектрейс даёт на вероятности Условные вероятности – ключевой момент анализа Deutsche Bank Профилирование Сэмплирование Deutsche Bank Профилирование Сэмплирование Гистограмма стек фреймов ... 316209 316209 316129 316129 316129 313448 313448 313448 309959 299384 296253 291880 289383 288139 287339 287331 281061 264960 258967 ... 28% 28% 28% 28% 28% 28% 28% 28% 28% 27% 26% 26% 26% 26% 26% 26% 25% 24% 23% Deutsche Bank 1065911 1065908 4096200 316129 3150391 3945843 3945843 3869592 309959 299384 803071 369667 289383 353384 352555 352581 343119 484726 270125 com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:379) com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:320) javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java com.sun.faces.facelets.tag.jsf.core.ViewHandler.apply(ViewHandler.java:188) javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:9 org.richfaces.view.facelets.html.BehaviorsAddingComponentHandlerWrapper.applyNextHandl com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandl javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagH org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:264) org.hibernate.internal.SessionImpl.autoFlushIfRequired(SessionImpl.java:1204) com.sun.faces.facelets.tag.ui.IncludeHandler.apply(IncludeHandler.java:120) org.jboss.seam.util.Reflections.invoke(Reflections.java:22) org.hibernate.internal.SessionImpl.list(SessionImpl.java:1261) org.jboss.seam.intercept.RootInvocationContext.proceed(RootInvocationContext.java:32) org.jboss.seam.transaction.RollbackInterceptor.aroundInvoke(RollbackInterceptor.java:2 org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:56) org.jboss.seam.core.BijectionInterceptor.aroundInvoke(BijectionInterceptor.java:79) com.sun.faces.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:166) com.sun.faces.facelets.impl.DefaultFaceletContext.includeDefinition(DefaultFaceletCont Профилирование Сэмплирование В ходе эксплуатации ▪ Один дамп в секунду ▪ в час ▪ за рабочий день ▪ в неделю ▪ Достаточно для анализа ▪ ▪ байт на стрейс количество потоков в дампе ≈ в неделю https://github.com/aragozin/jvm-tools Deutsche Bank Профилирование Mission Control / Flight recorder ▪ ▪ ▪ ▪ ▪ Компакт бинарный формат Легковесный Различные метрики Сэмплирование потоков Контекстное сэмплирование Читайте условия лицензии! Deutsche Bank В заключение ▪ Вам нужны метрики с продакшена хотя бы чтобы возпроизвести проблему ▪ Чуть больше информации и этого может быть достаточно чтобы идентифицировать её причину Deutsche Bank В заключение Вашем приложении сотни узких мест но лишь одно из них является проблемой которую надо решать именно сейчас Deutsche Bank СПАСИБО Алексей Рагозин Deutsche Bank