do it yourself profiler

63
© 2014 NetCracker Technology Corporation Confidential Профайлер в каждый дом Владимир Ситников

Upload: vladimir-sitnikov

Post on 22-Jun-2015

998 views

Category:

Software


3 download

DESCRIPTION

В этом докладе рассмотрен опыт NetCracker по выбору инструмента для изучения причин проблем производительности. Рассмотрены критерии по которым не подошли имеющиеся инструменты и показаны примеры того, чего не хватает при анализе результатов обычными профайлерами. http://jokerconf.com/#sitnikov

TRANSCRIPT

Page 1: Do it yourself profiler

copy 2014 NetCracker Technology Corporation Confidential

Профайлер в каждый дом

Владимир Ситников

2copy 2014 NetCracker Technology Corporation Confidential

Кто я

Владимир Ситников

System Performance NetCracker

sitnikovnetcrackercom

VladimirSitnikv

3copy 2014 NetCracker Technology Corporation Confidential

План

bull Зачем нужны профайлеры

bull Зачем создавать свой профайлер если есть готовое

bull Выбираем подходbull Sampling vs instrumentation

bull Пишем

bull Визуализация и анализ результатов

4copy 2014 NetCracker Technology Corporation Confidential

Типичный цикл разработки

Разработка Production

5copy 2014 NetCracker Technology Corporation Confidential

Типичный цикл разработки

Разработка ProductionPostmortem

optimization is root of all evil

6copy 2014 NetCracker Technology Corporation Confidential

Критерии оптимизации

Мы будем обсуждать операции по 0055+ сек

7copy 2014 NetCracker Technology Corporation Confidential

Зачем жениться профилировать

bull Надо чтобы работало гораздо быстрее

bull Сделано должно быть ещё вчера

bull Ты попал даже если там всего 1 твоя строка кода

8copy 2014 NetCracker Technology Corporation Confidential

Что ждём от профайлера

bull Нужно знать какие методы тормозилиbull MyDAOloadObjectbull SocketOutputStreamwrite

bull Нужно знать какие модули тормозилиbull Шапка таблица с результатами

9copy 2014 NetCracker Technology Corporation Confidential

Что нужно получать помимо длительности

bull Нужно знать что и когда происходилоbull Имя нажатой кнопки URL

bull Нужно знать контекстbull customer ID order ID user ID SQL запросы

параметры к ним и так далее

bull Нужно уметь заглядывать в прошлоеbull laquoУ нас вчера было лучшехужеraquo

10copy 2014 NetCracker Technology Corporation Confidential

Так ведь есть же профайлеры

bull Нужно чтобы профайлер был на каждом сервереbull DEVQAPROD

bull Профайлер может потребоваться каждому разработчикуbull Тут и на лицензиях разориться недолго

bull Профайлер должен понимать суть профилируемогоbull Иначе получим laquoвсё время потрачено в HashMapgetraquo

11copy 2014 NetCracker Technology Corporation Confidential

Интеграция профайлера и профилируемого кода

Код должен быть написан с оглядкой на профайлер

class UserServlet

private String userName

void doPost()

String userId =

Как значения userName и userId попадут в результаты

12copy 2014 NetCracker Technology Corporation Confidential

Интеграция профайлера и профилируемого кода

bull Нельзя просто взять и поправить старые версии кодаbull А профилировать всё равно нужно

bull Пока не получишь результат непонятно где и какие значения нужно захватыватьbull Цикл laquoпоправили-gtсобрали-gtвыдалиraquo играет против

нас

13copy 2014 NetCracker Technology Corporation Confidential

Интеграция профилируемого кода и профайлера

bull Передаём из JMeter специальный HTTP header

bull Ловим его в профайлере

bull Анализ результатов нагрузочного теста сильно упрощается

14copy 2014 NetCracker Technology Corporation Confidential

Есть профайлеры в java мире

15copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на клиенте

bull JavaScript наше измерительное всёbull GY analytics boomerang W3C Navigation timing API

W3C Mutation Observer API

bull HTTPbull accesslogCLIENT DATE TIME METHOD URL CODE SIZE DURATION

1011609 2011-06-14 172824 GET logoutjsp 302 279 0022

16copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа из самого приложения

Немного perf4jlog и у нас лог с замерами

StopWatch watch = new LoggingStopWatch(login)runnablerun()watchstop() how much watch

В логе будет как-то такstart[1415926535898] time[42] tag[login]

17copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Sampling poor mans profilerwatch -n 01 kill -3 pid

bull Каждые 01сек снимаем thread dumpbull И смотрим чем чаще всего занимаются потоки

18copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Смотрим ворох thread dumprsquoов[ACTIVE] ExecuteThread 0 runnable

at javautilzipZipFilegetEntry(Native Method)

at javautilzipZipFilegetEntry

- locked lt0x789162b8gt (a javautilzipZipFile)

at weblogicutilsclassloadersZipClassFindergetSource

at weblogicutilsclassloadersJarClassFindergetSource

at weblogicutilsclassloadersMultiClassFindergetSource

И понимаем что у нас safepoint bias

19copy 2014 NetCracker Technology Corporation Confidential

Safepoint

bull Нельзя просто остановить поток в произвольном местеbull Чтобы узнать stacktrace нужно-таки остановитьbull В вершине стека может оказаться случайный метод

bull Тем не менее снимать thread dumprsquoы с production раз в 5 минут весьма полезно

20copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на короткой ноге с JVM

honest-profiler

bull Решает проблему safepoint bias

bull Использует недокументированное API AsyncGetCallTrace

bull Пока не готово к production

21copy 2014 NetCracker Technology Corporation Confidential

Может купить какой-нибудь профайлер

Клиент не всегда согласен устанавливать сторонние инструменты

bull Прошлый отрицательный опытbull Цена вопросаbull Чрезмерная общностьbull Сложная адаптация кода к внешнему профайлеру

22copy 2014 NetCracker Technology Corporation Confidential

А что если создать профайлер для себя

23copy 2014 NetCracker Technology Corporation Confidential

Создать профайлер совсем несложно

bull Java byte code един для всех платформ

bull Добавляем methodEntermethodExit в нужные методы и дело в шляпеbull Instrumentation подход очень хорош для 10мс+

методов

24copy 2014 NetCracker Technology Corporation Confidential

MethodEntermethodExit

Варианты добавить профилирующие вызовыbull Вручную править исходный кодbull Javassistbull Aspect oriented programmingbull ASM Objectweb + Instrumentation API

25copy 2014 NetCracker Technology Corporation Confidential

Пишем профайлер за 4 шага

26copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash пишем логгер данных

Пишем логгер

class Profiler public static State methodEnter(int id)

interface State

public void methodExit()

public void logArg(int id String value)

27copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash что нужно от profiler logger

bull Хорошая скорость потоковой записиbull Компактность данныхbull По возможности random-accessbull Возможность экспорта данных за нужный интервал

времени

28copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash где взять логгер

bull Взять готовыйbull Chronicle-Queue Chronicle

bull Создать самимbull DataOutputStream(new GZIPOutputStream(hellip))

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 2: Do it yourself profiler

2copy 2014 NetCracker Technology Corporation Confidential

Кто я

Владимир Ситников

System Performance NetCracker

sitnikovnetcrackercom

VladimirSitnikv

3copy 2014 NetCracker Technology Corporation Confidential

План

bull Зачем нужны профайлеры

bull Зачем создавать свой профайлер если есть готовое

bull Выбираем подходbull Sampling vs instrumentation

bull Пишем

bull Визуализация и анализ результатов

4copy 2014 NetCracker Technology Corporation Confidential

Типичный цикл разработки

Разработка Production

5copy 2014 NetCracker Technology Corporation Confidential

Типичный цикл разработки

Разработка ProductionPostmortem

optimization is root of all evil

6copy 2014 NetCracker Technology Corporation Confidential

Критерии оптимизации

Мы будем обсуждать операции по 0055+ сек

7copy 2014 NetCracker Technology Corporation Confidential

Зачем жениться профилировать

bull Надо чтобы работало гораздо быстрее

bull Сделано должно быть ещё вчера

bull Ты попал даже если там всего 1 твоя строка кода

8copy 2014 NetCracker Technology Corporation Confidential

Что ждём от профайлера

bull Нужно знать какие методы тормозилиbull MyDAOloadObjectbull SocketOutputStreamwrite

bull Нужно знать какие модули тормозилиbull Шапка таблица с результатами

9copy 2014 NetCracker Technology Corporation Confidential

Что нужно получать помимо длительности

bull Нужно знать что и когда происходилоbull Имя нажатой кнопки URL

bull Нужно знать контекстbull customer ID order ID user ID SQL запросы

параметры к ним и так далее

bull Нужно уметь заглядывать в прошлоеbull laquoУ нас вчера было лучшехужеraquo

10copy 2014 NetCracker Technology Corporation Confidential

Так ведь есть же профайлеры

bull Нужно чтобы профайлер был на каждом сервереbull DEVQAPROD

bull Профайлер может потребоваться каждому разработчикуbull Тут и на лицензиях разориться недолго

bull Профайлер должен понимать суть профилируемогоbull Иначе получим laquoвсё время потрачено в HashMapgetraquo

11copy 2014 NetCracker Technology Corporation Confidential

Интеграция профайлера и профилируемого кода

Код должен быть написан с оглядкой на профайлер

class UserServlet

private String userName

void doPost()

String userId =

Как значения userName и userId попадут в результаты

12copy 2014 NetCracker Technology Corporation Confidential

Интеграция профайлера и профилируемого кода

bull Нельзя просто взять и поправить старые версии кодаbull А профилировать всё равно нужно

bull Пока не получишь результат непонятно где и какие значения нужно захватыватьbull Цикл laquoпоправили-gtсобрали-gtвыдалиraquo играет против

нас

13copy 2014 NetCracker Technology Corporation Confidential

Интеграция профилируемого кода и профайлера

bull Передаём из JMeter специальный HTTP header

bull Ловим его в профайлере

bull Анализ результатов нагрузочного теста сильно упрощается

14copy 2014 NetCracker Technology Corporation Confidential

Есть профайлеры в java мире

15copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на клиенте

bull JavaScript наше измерительное всёbull GY analytics boomerang W3C Navigation timing API

W3C Mutation Observer API

bull HTTPbull accesslogCLIENT DATE TIME METHOD URL CODE SIZE DURATION

1011609 2011-06-14 172824 GET logoutjsp 302 279 0022

16copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа из самого приложения

Немного perf4jlog и у нас лог с замерами

StopWatch watch = new LoggingStopWatch(login)runnablerun()watchstop() how much watch

В логе будет как-то такstart[1415926535898] time[42] tag[login]

17copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Sampling poor mans profilerwatch -n 01 kill -3 pid

bull Каждые 01сек снимаем thread dumpbull И смотрим чем чаще всего занимаются потоки

18copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Смотрим ворох thread dumprsquoов[ACTIVE] ExecuteThread 0 runnable

at javautilzipZipFilegetEntry(Native Method)

at javautilzipZipFilegetEntry

- locked lt0x789162b8gt (a javautilzipZipFile)

at weblogicutilsclassloadersZipClassFindergetSource

at weblogicutilsclassloadersJarClassFindergetSource

at weblogicutilsclassloadersMultiClassFindergetSource

И понимаем что у нас safepoint bias

19copy 2014 NetCracker Technology Corporation Confidential

Safepoint

bull Нельзя просто остановить поток в произвольном местеbull Чтобы узнать stacktrace нужно-таки остановитьbull В вершине стека может оказаться случайный метод

bull Тем не менее снимать thread dumprsquoы с production раз в 5 минут весьма полезно

20copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на короткой ноге с JVM

honest-profiler

bull Решает проблему safepoint bias

bull Использует недокументированное API AsyncGetCallTrace

bull Пока не готово к production

21copy 2014 NetCracker Technology Corporation Confidential

Может купить какой-нибудь профайлер

Клиент не всегда согласен устанавливать сторонние инструменты

bull Прошлый отрицательный опытbull Цена вопросаbull Чрезмерная общностьbull Сложная адаптация кода к внешнему профайлеру

22copy 2014 NetCracker Technology Corporation Confidential

А что если создать профайлер для себя

23copy 2014 NetCracker Technology Corporation Confidential

Создать профайлер совсем несложно

bull Java byte code един для всех платформ

bull Добавляем methodEntermethodExit в нужные методы и дело в шляпеbull Instrumentation подход очень хорош для 10мс+

методов

24copy 2014 NetCracker Technology Corporation Confidential

MethodEntermethodExit

Варианты добавить профилирующие вызовыbull Вручную править исходный кодbull Javassistbull Aspect oriented programmingbull ASM Objectweb + Instrumentation API

25copy 2014 NetCracker Technology Corporation Confidential

Пишем профайлер за 4 шага

26copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash пишем логгер данных

Пишем логгер

class Profiler public static State methodEnter(int id)

interface State

public void methodExit()

public void logArg(int id String value)

27copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash что нужно от profiler logger

bull Хорошая скорость потоковой записиbull Компактность данныхbull По возможности random-accessbull Возможность экспорта данных за нужный интервал

времени

28copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash где взять логгер

bull Взять готовыйbull Chronicle-Queue Chronicle

bull Создать самимbull DataOutputStream(new GZIPOutputStream(hellip))

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 3: Do it yourself profiler

3copy 2014 NetCracker Technology Corporation Confidential

План

bull Зачем нужны профайлеры

bull Зачем создавать свой профайлер если есть готовое

bull Выбираем подходbull Sampling vs instrumentation

bull Пишем

bull Визуализация и анализ результатов

4copy 2014 NetCracker Technology Corporation Confidential

Типичный цикл разработки

Разработка Production

5copy 2014 NetCracker Technology Corporation Confidential

Типичный цикл разработки

Разработка ProductionPostmortem

optimization is root of all evil

6copy 2014 NetCracker Technology Corporation Confidential

Критерии оптимизации

Мы будем обсуждать операции по 0055+ сек

7copy 2014 NetCracker Technology Corporation Confidential

Зачем жениться профилировать

bull Надо чтобы работало гораздо быстрее

bull Сделано должно быть ещё вчера

bull Ты попал даже если там всего 1 твоя строка кода

8copy 2014 NetCracker Technology Corporation Confidential

Что ждём от профайлера

bull Нужно знать какие методы тормозилиbull MyDAOloadObjectbull SocketOutputStreamwrite

bull Нужно знать какие модули тормозилиbull Шапка таблица с результатами

9copy 2014 NetCracker Technology Corporation Confidential

Что нужно получать помимо длительности

bull Нужно знать что и когда происходилоbull Имя нажатой кнопки URL

bull Нужно знать контекстbull customer ID order ID user ID SQL запросы

параметры к ним и так далее

bull Нужно уметь заглядывать в прошлоеbull laquoУ нас вчера было лучшехужеraquo

10copy 2014 NetCracker Technology Corporation Confidential

Так ведь есть же профайлеры

bull Нужно чтобы профайлер был на каждом сервереbull DEVQAPROD

bull Профайлер может потребоваться каждому разработчикуbull Тут и на лицензиях разориться недолго

bull Профайлер должен понимать суть профилируемогоbull Иначе получим laquoвсё время потрачено в HashMapgetraquo

11copy 2014 NetCracker Technology Corporation Confidential

Интеграция профайлера и профилируемого кода

Код должен быть написан с оглядкой на профайлер

class UserServlet

private String userName

void doPost()

String userId =

Как значения userName и userId попадут в результаты

12copy 2014 NetCracker Technology Corporation Confidential

Интеграция профайлера и профилируемого кода

bull Нельзя просто взять и поправить старые версии кодаbull А профилировать всё равно нужно

bull Пока не получишь результат непонятно где и какие значения нужно захватыватьbull Цикл laquoпоправили-gtсобрали-gtвыдалиraquo играет против

нас

13copy 2014 NetCracker Technology Corporation Confidential

Интеграция профилируемого кода и профайлера

bull Передаём из JMeter специальный HTTP header

bull Ловим его в профайлере

bull Анализ результатов нагрузочного теста сильно упрощается

14copy 2014 NetCracker Technology Corporation Confidential

Есть профайлеры в java мире

15copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на клиенте

bull JavaScript наше измерительное всёbull GY analytics boomerang W3C Navigation timing API

W3C Mutation Observer API

bull HTTPbull accesslogCLIENT DATE TIME METHOD URL CODE SIZE DURATION

1011609 2011-06-14 172824 GET logoutjsp 302 279 0022

16copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа из самого приложения

Немного perf4jlog и у нас лог с замерами

StopWatch watch = new LoggingStopWatch(login)runnablerun()watchstop() how much watch

В логе будет как-то такstart[1415926535898] time[42] tag[login]

17copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Sampling poor mans profilerwatch -n 01 kill -3 pid

bull Каждые 01сек снимаем thread dumpbull И смотрим чем чаще всего занимаются потоки

18copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Смотрим ворох thread dumprsquoов[ACTIVE] ExecuteThread 0 runnable

at javautilzipZipFilegetEntry(Native Method)

at javautilzipZipFilegetEntry

- locked lt0x789162b8gt (a javautilzipZipFile)

at weblogicutilsclassloadersZipClassFindergetSource

at weblogicutilsclassloadersJarClassFindergetSource

at weblogicutilsclassloadersMultiClassFindergetSource

И понимаем что у нас safepoint bias

19copy 2014 NetCracker Technology Corporation Confidential

Safepoint

bull Нельзя просто остановить поток в произвольном местеbull Чтобы узнать stacktrace нужно-таки остановитьbull В вершине стека может оказаться случайный метод

bull Тем не менее снимать thread dumprsquoы с production раз в 5 минут весьма полезно

20copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на короткой ноге с JVM

honest-profiler

bull Решает проблему safepoint bias

bull Использует недокументированное API AsyncGetCallTrace

bull Пока не готово к production

21copy 2014 NetCracker Technology Corporation Confidential

Может купить какой-нибудь профайлер

Клиент не всегда согласен устанавливать сторонние инструменты

bull Прошлый отрицательный опытbull Цена вопросаbull Чрезмерная общностьbull Сложная адаптация кода к внешнему профайлеру

22copy 2014 NetCracker Technology Corporation Confidential

А что если создать профайлер для себя

23copy 2014 NetCracker Technology Corporation Confidential

Создать профайлер совсем несложно

bull Java byte code един для всех платформ

bull Добавляем methodEntermethodExit в нужные методы и дело в шляпеbull Instrumentation подход очень хорош для 10мс+

методов

24copy 2014 NetCracker Technology Corporation Confidential

MethodEntermethodExit

Варианты добавить профилирующие вызовыbull Вручную править исходный кодbull Javassistbull Aspect oriented programmingbull ASM Objectweb + Instrumentation API

25copy 2014 NetCracker Technology Corporation Confidential

Пишем профайлер за 4 шага

26copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash пишем логгер данных

Пишем логгер

class Profiler public static State methodEnter(int id)

interface State

public void methodExit()

public void logArg(int id String value)

27copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash что нужно от profiler logger

bull Хорошая скорость потоковой записиbull Компактность данныхbull По возможности random-accessbull Возможность экспорта данных за нужный интервал

времени

28copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash где взять логгер

bull Взять готовыйbull Chronicle-Queue Chronicle

bull Создать самимbull DataOutputStream(new GZIPOutputStream(hellip))

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 4: Do it yourself profiler

4copy 2014 NetCracker Technology Corporation Confidential

Типичный цикл разработки

Разработка Production

5copy 2014 NetCracker Technology Corporation Confidential

Типичный цикл разработки

Разработка ProductionPostmortem

optimization is root of all evil

6copy 2014 NetCracker Technology Corporation Confidential

Критерии оптимизации

Мы будем обсуждать операции по 0055+ сек

7copy 2014 NetCracker Technology Corporation Confidential

Зачем жениться профилировать

bull Надо чтобы работало гораздо быстрее

bull Сделано должно быть ещё вчера

bull Ты попал даже если там всего 1 твоя строка кода

8copy 2014 NetCracker Technology Corporation Confidential

Что ждём от профайлера

bull Нужно знать какие методы тормозилиbull MyDAOloadObjectbull SocketOutputStreamwrite

bull Нужно знать какие модули тормозилиbull Шапка таблица с результатами

9copy 2014 NetCracker Technology Corporation Confidential

Что нужно получать помимо длительности

bull Нужно знать что и когда происходилоbull Имя нажатой кнопки URL

bull Нужно знать контекстbull customer ID order ID user ID SQL запросы

параметры к ним и так далее

bull Нужно уметь заглядывать в прошлоеbull laquoУ нас вчера было лучшехужеraquo

10copy 2014 NetCracker Technology Corporation Confidential

Так ведь есть же профайлеры

bull Нужно чтобы профайлер был на каждом сервереbull DEVQAPROD

bull Профайлер может потребоваться каждому разработчикуbull Тут и на лицензиях разориться недолго

bull Профайлер должен понимать суть профилируемогоbull Иначе получим laquoвсё время потрачено в HashMapgetraquo

11copy 2014 NetCracker Technology Corporation Confidential

Интеграция профайлера и профилируемого кода

Код должен быть написан с оглядкой на профайлер

class UserServlet

private String userName

void doPost()

String userId =

Как значения userName и userId попадут в результаты

12copy 2014 NetCracker Technology Corporation Confidential

Интеграция профайлера и профилируемого кода

bull Нельзя просто взять и поправить старые версии кодаbull А профилировать всё равно нужно

bull Пока не получишь результат непонятно где и какие значения нужно захватыватьbull Цикл laquoпоправили-gtсобрали-gtвыдалиraquo играет против

нас

13copy 2014 NetCracker Technology Corporation Confidential

Интеграция профилируемого кода и профайлера

bull Передаём из JMeter специальный HTTP header

bull Ловим его в профайлере

bull Анализ результатов нагрузочного теста сильно упрощается

14copy 2014 NetCracker Technology Corporation Confidential

Есть профайлеры в java мире

15copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на клиенте

bull JavaScript наше измерительное всёbull GY analytics boomerang W3C Navigation timing API

W3C Mutation Observer API

bull HTTPbull accesslogCLIENT DATE TIME METHOD URL CODE SIZE DURATION

1011609 2011-06-14 172824 GET logoutjsp 302 279 0022

16copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа из самого приложения

Немного perf4jlog и у нас лог с замерами

StopWatch watch = new LoggingStopWatch(login)runnablerun()watchstop() how much watch

В логе будет как-то такstart[1415926535898] time[42] tag[login]

17copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Sampling poor mans profilerwatch -n 01 kill -3 pid

bull Каждые 01сек снимаем thread dumpbull И смотрим чем чаще всего занимаются потоки

18copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Смотрим ворох thread dumprsquoов[ACTIVE] ExecuteThread 0 runnable

at javautilzipZipFilegetEntry(Native Method)

at javautilzipZipFilegetEntry

- locked lt0x789162b8gt (a javautilzipZipFile)

at weblogicutilsclassloadersZipClassFindergetSource

at weblogicutilsclassloadersJarClassFindergetSource

at weblogicutilsclassloadersMultiClassFindergetSource

И понимаем что у нас safepoint bias

19copy 2014 NetCracker Technology Corporation Confidential

Safepoint

bull Нельзя просто остановить поток в произвольном местеbull Чтобы узнать stacktrace нужно-таки остановитьbull В вершине стека может оказаться случайный метод

bull Тем не менее снимать thread dumprsquoы с production раз в 5 минут весьма полезно

20copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на короткой ноге с JVM

honest-profiler

bull Решает проблему safepoint bias

bull Использует недокументированное API AsyncGetCallTrace

bull Пока не готово к production

21copy 2014 NetCracker Technology Corporation Confidential

Может купить какой-нибудь профайлер

Клиент не всегда согласен устанавливать сторонние инструменты

bull Прошлый отрицательный опытbull Цена вопросаbull Чрезмерная общностьbull Сложная адаптация кода к внешнему профайлеру

22copy 2014 NetCracker Technology Corporation Confidential

А что если создать профайлер для себя

23copy 2014 NetCracker Technology Corporation Confidential

Создать профайлер совсем несложно

bull Java byte code един для всех платформ

bull Добавляем methodEntermethodExit в нужные методы и дело в шляпеbull Instrumentation подход очень хорош для 10мс+

методов

24copy 2014 NetCracker Technology Corporation Confidential

MethodEntermethodExit

Варианты добавить профилирующие вызовыbull Вручную править исходный кодbull Javassistbull Aspect oriented programmingbull ASM Objectweb + Instrumentation API

25copy 2014 NetCracker Technology Corporation Confidential

Пишем профайлер за 4 шага

26copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash пишем логгер данных

Пишем логгер

class Profiler public static State methodEnter(int id)

interface State

public void methodExit()

public void logArg(int id String value)

27copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash что нужно от profiler logger

bull Хорошая скорость потоковой записиbull Компактность данныхbull По возможности random-accessbull Возможность экспорта данных за нужный интервал

времени

28copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash где взять логгер

bull Взять готовыйbull Chronicle-Queue Chronicle

bull Создать самимbull DataOutputStream(new GZIPOutputStream(hellip))

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 5: Do it yourself profiler

5copy 2014 NetCracker Technology Corporation Confidential

Типичный цикл разработки

Разработка ProductionPostmortem

optimization is root of all evil

6copy 2014 NetCracker Technology Corporation Confidential

Критерии оптимизации

Мы будем обсуждать операции по 0055+ сек

7copy 2014 NetCracker Technology Corporation Confidential

Зачем жениться профилировать

bull Надо чтобы работало гораздо быстрее

bull Сделано должно быть ещё вчера

bull Ты попал даже если там всего 1 твоя строка кода

8copy 2014 NetCracker Technology Corporation Confidential

Что ждём от профайлера

bull Нужно знать какие методы тормозилиbull MyDAOloadObjectbull SocketOutputStreamwrite

bull Нужно знать какие модули тормозилиbull Шапка таблица с результатами

9copy 2014 NetCracker Technology Corporation Confidential

Что нужно получать помимо длительности

bull Нужно знать что и когда происходилоbull Имя нажатой кнопки URL

bull Нужно знать контекстbull customer ID order ID user ID SQL запросы

параметры к ним и так далее

bull Нужно уметь заглядывать в прошлоеbull laquoУ нас вчера было лучшехужеraquo

10copy 2014 NetCracker Technology Corporation Confidential

Так ведь есть же профайлеры

bull Нужно чтобы профайлер был на каждом сервереbull DEVQAPROD

bull Профайлер может потребоваться каждому разработчикуbull Тут и на лицензиях разориться недолго

bull Профайлер должен понимать суть профилируемогоbull Иначе получим laquoвсё время потрачено в HashMapgetraquo

11copy 2014 NetCracker Technology Corporation Confidential

Интеграция профайлера и профилируемого кода

Код должен быть написан с оглядкой на профайлер

class UserServlet

private String userName

void doPost()

String userId =

Как значения userName и userId попадут в результаты

12copy 2014 NetCracker Technology Corporation Confidential

Интеграция профайлера и профилируемого кода

bull Нельзя просто взять и поправить старые версии кодаbull А профилировать всё равно нужно

bull Пока не получишь результат непонятно где и какие значения нужно захватыватьbull Цикл laquoпоправили-gtсобрали-gtвыдалиraquo играет против

нас

13copy 2014 NetCracker Technology Corporation Confidential

Интеграция профилируемого кода и профайлера

bull Передаём из JMeter специальный HTTP header

bull Ловим его в профайлере

bull Анализ результатов нагрузочного теста сильно упрощается

14copy 2014 NetCracker Technology Corporation Confidential

Есть профайлеры в java мире

15copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на клиенте

bull JavaScript наше измерительное всёbull GY analytics boomerang W3C Navigation timing API

W3C Mutation Observer API

bull HTTPbull accesslogCLIENT DATE TIME METHOD URL CODE SIZE DURATION

1011609 2011-06-14 172824 GET logoutjsp 302 279 0022

16copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа из самого приложения

Немного perf4jlog и у нас лог с замерами

StopWatch watch = new LoggingStopWatch(login)runnablerun()watchstop() how much watch

В логе будет как-то такstart[1415926535898] time[42] tag[login]

17copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Sampling poor mans profilerwatch -n 01 kill -3 pid

bull Каждые 01сек снимаем thread dumpbull И смотрим чем чаще всего занимаются потоки

18copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Смотрим ворох thread dumprsquoов[ACTIVE] ExecuteThread 0 runnable

at javautilzipZipFilegetEntry(Native Method)

at javautilzipZipFilegetEntry

- locked lt0x789162b8gt (a javautilzipZipFile)

at weblogicutilsclassloadersZipClassFindergetSource

at weblogicutilsclassloadersJarClassFindergetSource

at weblogicutilsclassloadersMultiClassFindergetSource

И понимаем что у нас safepoint bias

19copy 2014 NetCracker Technology Corporation Confidential

Safepoint

bull Нельзя просто остановить поток в произвольном местеbull Чтобы узнать stacktrace нужно-таки остановитьbull В вершине стека может оказаться случайный метод

bull Тем не менее снимать thread dumprsquoы с production раз в 5 минут весьма полезно

20copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на короткой ноге с JVM

honest-profiler

bull Решает проблему safepoint bias

bull Использует недокументированное API AsyncGetCallTrace

bull Пока не готово к production

21copy 2014 NetCracker Technology Corporation Confidential

Может купить какой-нибудь профайлер

Клиент не всегда согласен устанавливать сторонние инструменты

bull Прошлый отрицательный опытbull Цена вопросаbull Чрезмерная общностьbull Сложная адаптация кода к внешнему профайлеру

22copy 2014 NetCracker Technology Corporation Confidential

А что если создать профайлер для себя

23copy 2014 NetCracker Technology Corporation Confidential

Создать профайлер совсем несложно

bull Java byte code един для всех платформ

bull Добавляем methodEntermethodExit в нужные методы и дело в шляпеbull Instrumentation подход очень хорош для 10мс+

методов

24copy 2014 NetCracker Technology Corporation Confidential

MethodEntermethodExit

Варианты добавить профилирующие вызовыbull Вручную править исходный кодbull Javassistbull Aspect oriented programmingbull ASM Objectweb + Instrumentation API

25copy 2014 NetCracker Technology Corporation Confidential

Пишем профайлер за 4 шага

26copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash пишем логгер данных

Пишем логгер

class Profiler public static State methodEnter(int id)

interface State

public void methodExit()

public void logArg(int id String value)

27copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash что нужно от profiler logger

bull Хорошая скорость потоковой записиbull Компактность данныхbull По возможности random-accessbull Возможность экспорта данных за нужный интервал

времени

28copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash где взять логгер

bull Взять готовыйbull Chronicle-Queue Chronicle

bull Создать самимbull DataOutputStream(new GZIPOutputStream(hellip))

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 6: Do it yourself profiler

6copy 2014 NetCracker Technology Corporation Confidential

Критерии оптимизации

Мы будем обсуждать операции по 0055+ сек

7copy 2014 NetCracker Technology Corporation Confidential

Зачем жениться профилировать

bull Надо чтобы работало гораздо быстрее

bull Сделано должно быть ещё вчера

bull Ты попал даже если там всего 1 твоя строка кода

8copy 2014 NetCracker Technology Corporation Confidential

Что ждём от профайлера

bull Нужно знать какие методы тормозилиbull MyDAOloadObjectbull SocketOutputStreamwrite

bull Нужно знать какие модули тормозилиbull Шапка таблица с результатами

9copy 2014 NetCracker Technology Corporation Confidential

Что нужно получать помимо длительности

bull Нужно знать что и когда происходилоbull Имя нажатой кнопки URL

bull Нужно знать контекстbull customer ID order ID user ID SQL запросы

параметры к ним и так далее

bull Нужно уметь заглядывать в прошлоеbull laquoУ нас вчера было лучшехужеraquo

10copy 2014 NetCracker Technology Corporation Confidential

Так ведь есть же профайлеры

bull Нужно чтобы профайлер был на каждом сервереbull DEVQAPROD

bull Профайлер может потребоваться каждому разработчикуbull Тут и на лицензиях разориться недолго

bull Профайлер должен понимать суть профилируемогоbull Иначе получим laquoвсё время потрачено в HashMapgetraquo

11copy 2014 NetCracker Technology Corporation Confidential

Интеграция профайлера и профилируемого кода

Код должен быть написан с оглядкой на профайлер

class UserServlet

private String userName

void doPost()

String userId =

Как значения userName и userId попадут в результаты

12copy 2014 NetCracker Technology Corporation Confidential

Интеграция профайлера и профилируемого кода

bull Нельзя просто взять и поправить старые версии кодаbull А профилировать всё равно нужно

bull Пока не получишь результат непонятно где и какие значения нужно захватыватьbull Цикл laquoпоправили-gtсобрали-gtвыдалиraquo играет против

нас

13copy 2014 NetCracker Technology Corporation Confidential

Интеграция профилируемого кода и профайлера

bull Передаём из JMeter специальный HTTP header

bull Ловим его в профайлере

bull Анализ результатов нагрузочного теста сильно упрощается

14copy 2014 NetCracker Technology Corporation Confidential

Есть профайлеры в java мире

15copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на клиенте

bull JavaScript наше измерительное всёbull GY analytics boomerang W3C Navigation timing API

W3C Mutation Observer API

bull HTTPbull accesslogCLIENT DATE TIME METHOD URL CODE SIZE DURATION

1011609 2011-06-14 172824 GET logoutjsp 302 279 0022

16copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа из самого приложения

Немного perf4jlog и у нас лог с замерами

StopWatch watch = new LoggingStopWatch(login)runnablerun()watchstop() how much watch

В логе будет как-то такstart[1415926535898] time[42] tag[login]

17copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Sampling poor mans profilerwatch -n 01 kill -3 pid

bull Каждые 01сек снимаем thread dumpbull И смотрим чем чаще всего занимаются потоки

18copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Смотрим ворох thread dumprsquoов[ACTIVE] ExecuteThread 0 runnable

at javautilzipZipFilegetEntry(Native Method)

at javautilzipZipFilegetEntry

- locked lt0x789162b8gt (a javautilzipZipFile)

at weblogicutilsclassloadersZipClassFindergetSource

at weblogicutilsclassloadersJarClassFindergetSource

at weblogicutilsclassloadersMultiClassFindergetSource

И понимаем что у нас safepoint bias

19copy 2014 NetCracker Technology Corporation Confidential

Safepoint

bull Нельзя просто остановить поток в произвольном местеbull Чтобы узнать stacktrace нужно-таки остановитьbull В вершине стека может оказаться случайный метод

bull Тем не менее снимать thread dumprsquoы с production раз в 5 минут весьма полезно

20copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на короткой ноге с JVM

honest-profiler

bull Решает проблему safepoint bias

bull Использует недокументированное API AsyncGetCallTrace

bull Пока не готово к production

21copy 2014 NetCracker Technology Corporation Confidential

Может купить какой-нибудь профайлер

Клиент не всегда согласен устанавливать сторонние инструменты

bull Прошлый отрицательный опытbull Цена вопросаbull Чрезмерная общностьbull Сложная адаптация кода к внешнему профайлеру

22copy 2014 NetCracker Technology Corporation Confidential

А что если создать профайлер для себя

23copy 2014 NetCracker Technology Corporation Confidential

Создать профайлер совсем несложно

bull Java byte code един для всех платформ

bull Добавляем methodEntermethodExit в нужные методы и дело в шляпеbull Instrumentation подход очень хорош для 10мс+

методов

24copy 2014 NetCracker Technology Corporation Confidential

MethodEntermethodExit

Варианты добавить профилирующие вызовыbull Вручную править исходный кодbull Javassistbull Aspect oriented programmingbull ASM Objectweb + Instrumentation API

25copy 2014 NetCracker Technology Corporation Confidential

Пишем профайлер за 4 шага

26copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash пишем логгер данных

Пишем логгер

class Profiler public static State methodEnter(int id)

interface State

public void methodExit()

public void logArg(int id String value)

27copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash что нужно от profiler logger

bull Хорошая скорость потоковой записиbull Компактность данныхbull По возможности random-accessbull Возможность экспорта данных за нужный интервал

времени

28copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash где взять логгер

bull Взять готовыйbull Chronicle-Queue Chronicle

bull Создать самимbull DataOutputStream(new GZIPOutputStream(hellip))

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 7: Do it yourself profiler

7copy 2014 NetCracker Technology Corporation Confidential

Зачем жениться профилировать

bull Надо чтобы работало гораздо быстрее

bull Сделано должно быть ещё вчера

bull Ты попал даже если там всего 1 твоя строка кода

8copy 2014 NetCracker Technology Corporation Confidential

Что ждём от профайлера

bull Нужно знать какие методы тормозилиbull MyDAOloadObjectbull SocketOutputStreamwrite

bull Нужно знать какие модули тормозилиbull Шапка таблица с результатами

9copy 2014 NetCracker Technology Corporation Confidential

Что нужно получать помимо длительности

bull Нужно знать что и когда происходилоbull Имя нажатой кнопки URL

bull Нужно знать контекстbull customer ID order ID user ID SQL запросы

параметры к ним и так далее

bull Нужно уметь заглядывать в прошлоеbull laquoУ нас вчера было лучшехужеraquo

10copy 2014 NetCracker Technology Corporation Confidential

Так ведь есть же профайлеры

bull Нужно чтобы профайлер был на каждом сервереbull DEVQAPROD

bull Профайлер может потребоваться каждому разработчикуbull Тут и на лицензиях разориться недолго

bull Профайлер должен понимать суть профилируемогоbull Иначе получим laquoвсё время потрачено в HashMapgetraquo

11copy 2014 NetCracker Technology Corporation Confidential

Интеграция профайлера и профилируемого кода

Код должен быть написан с оглядкой на профайлер

class UserServlet

private String userName

void doPost()

String userId =

Как значения userName и userId попадут в результаты

12copy 2014 NetCracker Technology Corporation Confidential

Интеграция профайлера и профилируемого кода

bull Нельзя просто взять и поправить старые версии кодаbull А профилировать всё равно нужно

bull Пока не получишь результат непонятно где и какие значения нужно захватыватьbull Цикл laquoпоправили-gtсобрали-gtвыдалиraquo играет против

нас

13copy 2014 NetCracker Technology Corporation Confidential

Интеграция профилируемого кода и профайлера

bull Передаём из JMeter специальный HTTP header

bull Ловим его в профайлере

bull Анализ результатов нагрузочного теста сильно упрощается

14copy 2014 NetCracker Technology Corporation Confidential

Есть профайлеры в java мире

15copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на клиенте

bull JavaScript наше измерительное всёbull GY analytics boomerang W3C Navigation timing API

W3C Mutation Observer API

bull HTTPbull accesslogCLIENT DATE TIME METHOD URL CODE SIZE DURATION

1011609 2011-06-14 172824 GET logoutjsp 302 279 0022

16copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа из самого приложения

Немного perf4jlog и у нас лог с замерами

StopWatch watch = new LoggingStopWatch(login)runnablerun()watchstop() how much watch

В логе будет как-то такstart[1415926535898] time[42] tag[login]

17copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Sampling poor mans profilerwatch -n 01 kill -3 pid

bull Каждые 01сек снимаем thread dumpbull И смотрим чем чаще всего занимаются потоки

18copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Смотрим ворох thread dumprsquoов[ACTIVE] ExecuteThread 0 runnable

at javautilzipZipFilegetEntry(Native Method)

at javautilzipZipFilegetEntry

- locked lt0x789162b8gt (a javautilzipZipFile)

at weblogicutilsclassloadersZipClassFindergetSource

at weblogicutilsclassloadersJarClassFindergetSource

at weblogicutilsclassloadersMultiClassFindergetSource

И понимаем что у нас safepoint bias

19copy 2014 NetCracker Technology Corporation Confidential

Safepoint

bull Нельзя просто остановить поток в произвольном местеbull Чтобы узнать stacktrace нужно-таки остановитьbull В вершине стека может оказаться случайный метод

bull Тем не менее снимать thread dumprsquoы с production раз в 5 минут весьма полезно

20copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на короткой ноге с JVM

honest-profiler

bull Решает проблему safepoint bias

bull Использует недокументированное API AsyncGetCallTrace

bull Пока не готово к production

21copy 2014 NetCracker Technology Corporation Confidential

Может купить какой-нибудь профайлер

Клиент не всегда согласен устанавливать сторонние инструменты

bull Прошлый отрицательный опытbull Цена вопросаbull Чрезмерная общностьbull Сложная адаптация кода к внешнему профайлеру

22copy 2014 NetCracker Technology Corporation Confidential

А что если создать профайлер для себя

23copy 2014 NetCracker Technology Corporation Confidential

Создать профайлер совсем несложно

bull Java byte code един для всех платформ

bull Добавляем methodEntermethodExit в нужные методы и дело в шляпеbull Instrumentation подход очень хорош для 10мс+

методов

24copy 2014 NetCracker Technology Corporation Confidential

MethodEntermethodExit

Варианты добавить профилирующие вызовыbull Вручную править исходный кодbull Javassistbull Aspect oriented programmingbull ASM Objectweb + Instrumentation API

25copy 2014 NetCracker Technology Corporation Confidential

Пишем профайлер за 4 шага

26copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash пишем логгер данных

Пишем логгер

class Profiler public static State methodEnter(int id)

interface State

public void methodExit()

public void logArg(int id String value)

27copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash что нужно от profiler logger

bull Хорошая скорость потоковой записиbull Компактность данныхbull По возможности random-accessbull Возможность экспорта данных за нужный интервал

времени

28copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash где взять логгер

bull Взять готовыйbull Chronicle-Queue Chronicle

bull Создать самимbull DataOutputStream(new GZIPOutputStream(hellip))

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 8: Do it yourself profiler

8copy 2014 NetCracker Technology Corporation Confidential

Что ждём от профайлера

bull Нужно знать какие методы тормозилиbull MyDAOloadObjectbull SocketOutputStreamwrite

bull Нужно знать какие модули тормозилиbull Шапка таблица с результатами

9copy 2014 NetCracker Technology Corporation Confidential

Что нужно получать помимо длительности

bull Нужно знать что и когда происходилоbull Имя нажатой кнопки URL

bull Нужно знать контекстbull customer ID order ID user ID SQL запросы

параметры к ним и так далее

bull Нужно уметь заглядывать в прошлоеbull laquoУ нас вчера было лучшехужеraquo

10copy 2014 NetCracker Technology Corporation Confidential

Так ведь есть же профайлеры

bull Нужно чтобы профайлер был на каждом сервереbull DEVQAPROD

bull Профайлер может потребоваться каждому разработчикуbull Тут и на лицензиях разориться недолго

bull Профайлер должен понимать суть профилируемогоbull Иначе получим laquoвсё время потрачено в HashMapgetraquo

11copy 2014 NetCracker Technology Corporation Confidential

Интеграция профайлера и профилируемого кода

Код должен быть написан с оглядкой на профайлер

class UserServlet

private String userName

void doPost()

String userId =

Как значения userName и userId попадут в результаты

12copy 2014 NetCracker Technology Corporation Confidential

Интеграция профайлера и профилируемого кода

bull Нельзя просто взять и поправить старые версии кодаbull А профилировать всё равно нужно

bull Пока не получишь результат непонятно где и какие значения нужно захватыватьbull Цикл laquoпоправили-gtсобрали-gtвыдалиraquo играет против

нас

13copy 2014 NetCracker Technology Corporation Confidential

Интеграция профилируемого кода и профайлера

bull Передаём из JMeter специальный HTTP header

bull Ловим его в профайлере

bull Анализ результатов нагрузочного теста сильно упрощается

14copy 2014 NetCracker Technology Corporation Confidential

Есть профайлеры в java мире

15copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на клиенте

bull JavaScript наше измерительное всёbull GY analytics boomerang W3C Navigation timing API

W3C Mutation Observer API

bull HTTPbull accesslogCLIENT DATE TIME METHOD URL CODE SIZE DURATION

1011609 2011-06-14 172824 GET logoutjsp 302 279 0022

16copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа из самого приложения

Немного perf4jlog и у нас лог с замерами

StopWatch watch = new LoggingStopWatch(login)runnablerun()watchstop() how much watch

В логе будет как-то такstart[1415926535898] time[42] tag[login]

17copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Sampling poor mans profilerwatch -n 01 kill -3 pid

bull Каждые 01сек снимаем thread dumpbull И смотрим чем чаще всего занимаются потоки

18copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Смотрим ворох thread dumprsquoов[ACTIVE] ExecuteThread 0 runnable

at javautilzipZipFilegetEntry(Native Method)

at javautilzipZipFilegetEntry

- locked lt0x789162b8gt (a javautilzipZipFile)

at weblogicutilsclassloadersZipClassFindergetSource

at weblogicutilsclassloadersJarClassFindergetSource

at weblogicutilsclassloadersMultiClassFindergetSource

И понимаем что у нас safepoint bias

19copy 2014 NetCracker Technology Corporation Confidential

Safepoint

bull Нельзя просто остановить поток в произвольном местеbull Чтобы узнать stacktrace нужно-таки остановитьbull В вершине стека может оказаться случайный метод

bull Тем не менее снимать thread dumprsquoы с production раз в 5 минут весьма полезно

20copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на короткой ноге с JVM

honest-profiler

bull Решает проблему safepoint bias

bull Использует недокументированное API AsyncGetCallTrace

bull Пока не готово к production

21copy 2014 NetCracker Technology Corporation Confidential

Может купить какой-нибудь профайлер

Клиент не всегда согласен устанавливать сторонние инструменты

bull Прошлый отрицательный опытbull Цена вопросаbull Чрезмерная общностьbull Сложная адаптация кода к внешнему профайлеру

22copy 2014 NetCracker Technology Corporation Confidential

А что если создать профайлер для себя

23copy 2014 NetCracker Technology Corporation Confidential

Создать профайлер совсем несложно

bull Java byte code един для всех платформ

bull Добавляем methodEntermethodExit в нужные методы и дело в шляпеbull Instrumentation подход очень хорош для 10мс+

методов

24copy 2014 NetCracker Technology Corporation Confidential

MethodEntermethodExit

Варианты добавить профилирующие вызовыbull Вручную править исходный кодbull Javassistbull Aspect oriented programmingbull ASM Objectweb + Instrumentation API

25copy 2014 NetCracker Technology Corporation Confidential

Пишем профайлер за 4 шага

26copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash пишем логгер данных

Пишем логгер

class Profiler public static State methodEnter(int id)

interface State

public void methodExit()

public void logArg(int id String value)

27copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash что нужно от profiler logger

bull Хорошая скорость потоковой записиbull Компактность данныхbull По возможности random-accessbull Возможность экспорта данных за нужный интервал

времени

28copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash где взять логгер

bull Взять готовыйbull Chronicle-Queue Chronicle

bull Создать самимbull DataOutputStream(new GZIPOutputStream(hellip))

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 9: Do it yourself profiler

9copy 2014 NetCracker Technology Corporation Confidential

Что нужно получать помимо длительности

bull Нужно знать что и когда происходилоbull Имя нажатой кнопки URL

bull Нужно знать контекстbull customer ID order ID user ID SQL запросы

параметры к ним и так далее

bull Нужно уметь заглядывать в прошлоеbull laquoУ нас вчера было лучшехужеraquo

10copy 2014 NetCracker Technology Corporation Confidential

Так ведь есть же профайлеры

bull Нужно чтобы профайлер был на каждом сервереbull DEVQAPROD

bull Профайлер может потребоваться каждому разработчикуbull Тут и на лицензиях разориться недолго

bull Профайлер должен понимать суть профилируемогоbull Иначе получим laquoвсё время потрачено в HashMapgetraquo

11copy 2014 NetCracker Technology Corporation Confidential

Интеграция профайлера и профилируемого кода

Код должен быть написан с оглядкой на профайлер

class UserServlet

private String userName

void doPost()

String userId =

Как значения userName и userId попадут в результаты

12copy 2014 NetCracker Technology Corporation Confidential

Интеграция профайлера и профилируемого кода

bull Нельзя просто взять и поправить старые версии кодаbull А профилировать всё равно нужно

bull Пока не получишь результат непонятно где и какие значения нужно захватыватьbull Цикл laquoпоправили-gtсобрали-gtвыдалиraquo играет против

нас

13copy 2014 NetCracker Technology Corporation Confidential

Интеграция профилируемого кода и профайлера

bull Передаём из JMeter специальный HTTP header

bull Ловим его в профайлере

bull Анализ результатов нагрузочного теста сильно упрощается

14copy 2014 NetCracker Technology Corporation Confidential

Есть профайлеры в java мире

15copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на клиенте

bull JavaScript наше измерительное всёbull GY analytics boomerang W3C Navigation timing API

W3C Mutation Observer API

bull HTTPbull accesslogCLIENT DATE TIME METHOD URL CODE SIZE DURATION

1011609 2011-06-14 172824 GET logoutjsp 302 279 0022

16copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа из самого приложения

Немного perf4jlog и у нас лог с замерами

StopWatch watch = new LoggingStopWatch(login)runnablerun()watchstop() how much watch

В логе будет как-то такstart[1415926535898] time[42] tag[login]

17copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Sampling poor mans profilerwatch -n 01 kill -3 pid

bull Каждые 01сек снимаем thread dumpbull И смотрим чем чаще всего занимаются потоки

18copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Смотрим ворох thread dumprsquoов[ACTIVE] ExecuteThread 0 runnable

at javautilzipZipFilegetEntry(Native Method)

at javautilzipZipFilegetEntry

- locked lt0x789162b8gt (a javautilzipZipFile)

at weblogicutilsclassloadersZipClassFindergetSource

at weblogicutilsclassloadersJarClassFindergetSource

at weblogicutilsclassloadersMultiClassFindergetSource

И понимаем что у нас safepoint bias

19copy 2014 NetCracker Technology Corporation Confidential

Safepoint

bull Нельзя просто остановить поток в произвольном местеbull Чтобы узнать stacktrace нужно-таки остановитьbull В вершине стека может оказаться случайный метод

bull Тем не менее снимать thread dumprsquoы с production раз в 5 минут весьма полезно

20copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на короткой ноге с JVM

honest-profiler

bull Решает проблему safepoint bias

bull Использует недокументированное API AsyncGetCallTrace

bull Пока не готово к production

21copy 2014 NetCracker Technology Corporation Confidential

Может купить какой-нибудь профайлер

Клиент не всегда согласен устанавливать сторонние инструменты

bull Прошлый отрицательный опытbull Цена вопросаbull Чрезмерная общностьbull Сложная адаптация кода к внешнему профайлеру

22copy 2014 NetCracker Technology Corporation Confidential

А что если создать профайлер для себя

23copy 2014 NetCracker Technology Corporation Confidential

Создать профайлер совсем несложно

bull Java byte code един для всех платформ

bull Добавляем methodEntermethodExit в нужные методы и дело в шляпеbull Instrumentation подход очень хорош для 10мс+

методов

24copy 2014 NetCracker Technology Corporation Confidential

MethodEntermethodExit

Варианты добавить профилирующие вызовыbull Вручную править исходный кодbull Javassistbull Aspect oriented programmingbull ASM Objectweb + Instrumentation API

25copy 2014 NetCracker Technology Corporation Confidential

Пишем профайлер за 4 шага

26copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash пишем логгер данных

Пишем логгер

class Profiler public static State methodEnter(int id)

interface State

public void methodExit()

public void logArg(int id String value)

27copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash что нужно от profiler logger

bull Хорошая скорость потоковой записиbull Компактность данныхbull По возможности random-accessbull Возможность экспорта данных за нужный интервал

времени

28copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash где взять логгер

bull Взять готовыйbull Chronicle-Queue Chronicle

bull Создать самимbull DataOutputStream(new GZIPOutputStream(hellip))

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 10: Do it yourself profiler

10copy 2014 NetCracker Technology Corporation Confidential

Так ведь есть же профайлеры

bull Нужно чтобы профайлер был на каждом сервереbull DEVQAPROD

bull Профайлер может потребоваться каждому разработчикуbull Тут и на лицензиях разориться недолго

bull Профайлер должен понимать суть профилируемогоbull Иначе получим laquoвсё время потрачено в HashMapgetraquo

11copy 2014 NetCracker Technology Corporation Confidential

Интеграция профайлера и профилируемого кода

Код должен быть написан с оглядкой на профайлер

class UserServlet

private String userName

void doPost()

String userId =

Как значения userName и userId попадут в результаты

12copy 2014 NetCracker Technology Corporation Confidential

Интеграция профайлера и профилируемого кода

bull Нельзя просто взять и поправить старые версии кодаbull А профилировать всё равно нужно

bull Пока не получишь результат непонятно где и какие значения нужно захватыватьbull Цикл laquoпоправили-gtсобрали-gtвыдалиraquo играет против

нас

13copy 2014 NetCracker Technology Corporation Confidential

Интеграция профилируемого кода и профайлера

bull Передаём из JMeter специальный HTTP header

bull Ловим его в профайлере

bull Анализ результатов нагрузочного теста сильно упрощается

14copy 2014 NetCracker Technology Corporation Confidential

Есть профайлеры в java мире

15copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на клиенте

bull JavaScript наше измерительное всёbull GY analytics boomerang W3C Navigation timing API

W3C Mutation Observer API

bull HTTPbull accesslogCLIENT DATE TIME METHOD URL CODE SIZE DURATION

1011609 2011-06-14 172824 GET logoutjsp 302 279 0022

16copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа из самого приложения

Немного perf4jlog и у нас лог с замерами

StopWatch watch = new LoggingStopWatch(login)runnablerun()watchstop() how much watch

В логе будет как-то такstart[1415926535898] time[42] tag[login]

17copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Sampling poor mans profilerwatch -n 01 kill -3 pid

bull Каждые 01сек снимаем thread dumpbull И смотрим чем чаще всего занимаются потоки

18copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Смотрим ворох thread dumprsquoов[ACTIVE] ExecuteThread 0 runnable

at javautilzipZipFilegetEntry(Native Method)

at javautilzipZipFilegetEntry

- locked lt0x789162b8gt (a javautilzipZipFile)

at weblogicutilsclassloadersZipClassFindergetSource

at weblogicutilsclassloadersJarClassFindergetSource

at weblogicutilsclassloadersMultiClassFindergetSource

И понимаем что у нас safepoint bias

19copy 2014 NetCracker Technology Corporation Confidential

Safepoint

bull Нельзя просто остановить поток в произвольном местеbull Чтобы узнать stacktrace нужно-таки остановитьbull В вершине стека может оказаться случайный метод

bull Тем не менее снимать thread dumprsquoы с production раз в 5 минут весьма полезно

20copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на короткой ноге с JVM

honest-profiler

bull Решает проблему safepoint bias

bull Использует недокументированное API AsyncGetCallTrace

bull Пока не готово к production

21copy 2014 NetCracker Technology Corporation Confidential

Может купить какой-нибудь профайлер

Клиент не всегда согласен устанавливать сторонние инструменты

bull Прошлый отрицательный опытbull Цена вопросаbull Чрезмерная общностьbull Сложная адаптация кода к внешнему профайлеру

22copy 2014 NetCracker Technology Corporation Confidential

А что если создать профайлер для себя

23copy 2014 NetCracker Technology Corporation Confidential

Создать профайлер совсем несложно

bull Java byte code един для всех платформ

bull Добавляем methodEntermethodExit в нужные методы и дело в шляпеbull Instrumentation подход очень хорош для 10мс+

методов

24copy 2014 NetCracker Technology Corporation Confidential

MethodEntermethodExit

Варианты добавить профилирующие вызовыbull Вручную править исходный кодbull Javassistbull Aspect oriented programmingbull ASM Objectweb + Instrumentation API

25copy 2014 NetCracker Technology Corporation Confidential

Пишем профайлер за 4 шага

26copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash пишем логгер данных

Пишем логгер

class Profiler public static State methodEnter(int id)

interface State

public void methodExit()

public void logArg(int id String value)

27copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash что нужно от profiler logger

bull Хорошая скорость потоковой записиbull Компактность данныхbull По возможности random-accessbull Возможность экспорта данных за нужный интервал

времени

28copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash где взять логгер

bull Взять готовыйbull Chronicle-Queue Chronicle

bull Создать самимbull DataOutputStream(new GZIPOutputStream(hellip))

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 11: Do it yourself profiler

11copy 2014 NetCracker Technology Corporation Confidential

Интеграция профайлера и профилируемого кода

Код должен быть написан с оглядкой на профайлер

class UserServlet

private String userName

void doPost()

String userId =

Как значения userName и userId попадут в результаты

12copy 2014 NetCracker Technology Corporation Confidential

Интеграция профайлера и профилируемого кода

bull Нельзя просто взять и поправить старые версии кодаbull А профилировать всё равно нужно

bull Пока не получишь результат непонятно где и какие значения нужно захватыватьbull Цикл laquoпоправили-gtсобрали-gtвыдалиraquo играет против

нас

13copy 2014 NetCracker Technology Corporation Confidential

Интеграция профилируемого кода и профайлера

bull Передаём из JMeter специальный HTTP header

bull Ловим его в профайлере

bull Анализ результатов нагрузочного теста сильно упрощается

14copy 2014 NetCracker Technology Corporation Confidential

Есть профайлеры в java мире

15copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на клиенте

bull JavaScript наше измерительное всёbull GY analytics boomerang W3C Navigation timing API

W3C Mutation Observer API

bull HTTPbull accesslogCLIENT DATE TIME METHOD URL CODE SIZE DURATION

1011609 2011-06-14 172824 GET logoutjsp 302 279 0022

16copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа из самого приложения

Немного perf4jlog и у нас лог с замерами

StopWatch watch = new LoggingStopWatch(login)runnablerun()watchstop() how much watch

В логе будет как-то такstart[1415926535898] time[42] tag[login]

17copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Sampling poor mans profilerwatch -n 01 kill -3 pid

bull Каждые 01сек снимаем thread dumpbull И смотрим чем чаще всего занимаются потоки

18copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Смотрим ворох thread dumprsquoов[ACTIVE] ExecuteThread 0 runnable

at javautilzipZipFilegetEntry(Native Method)

at javautilzipZipFilegetEntry

- locked lt0x789162b8gt (a javautilzipZipFile)

at weblogicutilsclassloadersZipClassFindergetSource

at weblogicutilsclassloadersJarClassFindergetSource

at weblogicutilsclassloadersMultiClassFindergetSource

И понимаем что у нас safepoint bias

19copy 2014 NetCracker Technology Corporation Confidential

Safepoint

bull Нельзя просто остановить поток в произвольном местеbull Чтобы узнать stacktrace нужно-таки остановитьbull В вершине стека может оказаться случайный метод

bull Тем не менее снимать thread dumprsquoы с production раз в 5 минут весьма полезно

20copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на короткой ноге с JVM

honest-profiler

bull Решает проблему safepoint bias

bull Использует недокументированное API AsyncGetCallTrace

bull Пока не готово к production

21copy 2014 NetCracker Technology Corporation Confidential

Может купить какой-нибудь профайлер

Клиент не всегда согласен устанавливать сторонние инструменты

bull Прошлый отрицательный опытbull Цена вопросаbull Чрезмерная общностьbull Сложная адаптация кода к внешнему профайлеру

22copy 2014 NetCracker Technology Corporation Confidential

А что если создать профайлер для себя

23copy 2014 NetCracker Technology Corporation Confidential

Создать профайлер совсем несложно

bull Java byte code един для всех платформ

bull Добавляем methodEntermethodExit в нужные методы и дело в шляпеbull Instrumentation подход очень хорош для 10мс+

методов

24copy 2014 NetCracker Technology Corporation Confidential

MethodEntermethodExit

Варианты добавить профилирующие вызовыbull Вручную править исходный кодbull Javassistbull Aspect oriented programmingbull ASM Objectweb + Instrumentation API

25copy 2014 NetCracker Technology Corporation Confidential

Пишем профайлер за 4 шага

26copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash пишем логгер данных

Пишем логгер

class Profiler public static State methodEnter(int id)

interface State

public void methodExit()

public void logArg(int id String value)

27copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash что нужно от profiler logger

bull Хорошая скорость потоковой записиbull Компактность данныхbull По возможности random-accessbull Возможность экспорта данных за нужный интервал

времени

28copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash где взять логгер

bull Взять готовыйbull Chronicle-Queue Chronicle

bull Создать самимbull DataOutputStream(new GZIPOutputStream(hellip))

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 12: Do it yourself profiler

12copy 2014 NetCracker Technology Corporation Confidential

Интеграция профайлера и профилируемого кода

bull Нельзя просто взять и поправить старые версии кодаbull А профилировать всё равно нужно

bull Пока не получишь результат непонятно где и какие значения нужно захватыватьbull Цикл laquoпоправили-gtсобрали-gtвыдалиraquo играет против

нас

13copy 2014 NetCracker Technology Corporation Confidential

Интеграция профилируемого кода и профайлера

bull Передаём из JMeter специальный HTTP header

bull Ловим его в профайлере

bull Анализ результатов нагрузочного теста сильно упрощается

14copy 2014 NetCracker Technology Corporation Confidential

Есть профайлеры в java мире

15copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на клиенте

bull JavaScript наше измерительное всёbull GY analytics boomerang W3C Navigation timing API

W3C Mutation Observer API

bull HTTPbull accesslogCLIENT DATE TIME METHOD URL CODE SIZE DURATION

1011609 2011-06-14 172824 GET logoutjsp 302 279 0022

16copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа из самого приложения

Немного perf4jlog и у нас лог с замерами

StopWatch watch = new LoggingStopWatch(login)runnablerun()watchstop() how much watch

В логе будет как-то такstart[1415926535898] time[42] tag[login]

17copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Sampling poor mans profilerwatch -n 01 kill -3 pid

bull Каждые 01сек снимаем thread dumpbull И смотрим чем чаще всего занимаются потоки

18copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Смотрим ворох thread dumprsquoов[ACTIVE] ExecuteThread 0 runnable

at javautilzipZipFilegetEntry(Native Method)

at javautilzipZipFilegetEntry

- locked lt0x789162b8gt (a javautilzipZipFile)

at weblogicutilsclassloadersZipClassFindergetSource

at weblogicutilsclassloadersJarClassFindergetSource

at weblogicutilsclassloadersMultiClassFindergetSource

И понимаем что у нас safepoint bias

19copy 2014 NetCracker Technology Corporation Confidential

Safepoint

bull Нельзя просто остановить поток в произвольном местеbull Чтобы узнать stacktrace нужно-таки остановитьbull В вершине стека может оказаться случайный метод

bull Тем не менее снимать thread dumprsquoы с production раз в 5 минут весьма полезно

20copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на короткой ноге с JVM

honest-profiler

bull Решает проблему safepoint bias

bull Использует недокументированное API AsyncGetCallTrace

bull Пока не готово к production

21copy 2014 NetCracker Technology Corporation Confidential

Может купить какой-нибудь профайлер

Клиент не всегда согласен устанавливать сторонние инструменты

bull Прошлый отрицательный опытbull Цена вопросаbull Чрезмерная общностьbull Сложная адаптация кода к внешнему профайлеру

22copy 2014 NetCracker Technology Corporation Confidential

А что если создать профайлер для себя

23copy 2014 NetCracker Technology Corporation Confidential

Создать профайлер совсем несложно

bull Java byte code един для всех платформ

bull Добавляем methodEntermethodExit в нужные методы и дело в шляпеbull Instrumentation подход очень хорош для 10мс+

методов

24copy 2014 NetCracker Technology Corporation Confidential

MethodEntermethodExit

Варианты добавить профилирующие вызовыbull Вручную править исходный кодbull Javassistbull Aspect oriented programmingbull ASM Objectweb + Instrumentation API

25copy 2014 NetCracker Technology Corporation Confidential

Пишем профайлер за 4 шага

26copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash пишем логгер данных

Пишем логгер

class Profiler public static State methodEnter(int id)

interface State

public void methodExit()

public void logArg(int id String value)

27copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash что нужно от profiler logger

bull Хорошая скорость потоковой записиbull Компактность данныхbull По возможности random-accessbull Возможность экспорта данных за нужный интервал

времени

28copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash где взять логгер

bull Взять готовыйbull Chronicle-Queue Chronicle

bull Создать самимbull DataOutputStream(new GZIPOutputStream(hellip))

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 13: Do it yourself profiler

13copy 2014 NetCracker Technology Corporation Confidential

Интеграция профилируемого кода и профайлера

bull Передаём из JMeter специальный HTTP header

bull Ловим его в профайлере

bull Анализ результатов нагрузочного теста сильно упрощается

14copy 2014 NetCracker Technology Corporation Confidential

Есть профайлеры в java мире

15copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на клиенте

bull JavaScript наше измерительное всёbull GY analytics boomerang W3C Navigation timing API

W3C Mutation Observer API

bull HTTPbull accesslogCLIENT DATE TIME METHOD URL CODE SIZE DURATION

1011609 2011-06-14 172824 GET logoutjsp 302 279 0022

16copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа из самого приложения

Немного perf4jlog и у нас лог с замерами

StopWatch watch = new LoggingStopWatch(login)runnablerun()watchstop() how much watch

В логе будет как-то такstart[1415926535898] time[42] tag[login]

17copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Sampling poor mans profilerwatch -n 01 kill -3 pid

bull Каждые 01сек снимаем thread dumpbull И смотрим чем чаще всего занимаются потоки

18copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Смотрим ворох thread dumprsquoов[ACTIVE] ExecuteThread 0 runnable

at javautilzipZipFilegetEntry(Native Method)

at javautilzipZipFilegetEntry

- locked lt0x789162b8gt (a javautilzipZipFile)

at weblogicutilsclassloadersZipClassFindergetSource

at weblogicutilsclassloadersJarClassFindergetSource

at weblogicutilsclassloadersMultiClassFindergetSource

И понимаем что у нас safepoint bias

19copy 2014 NetCracker Technology Corporation Confidential

Safepoint

bull Нельзя просто остановить поток в произвольном местеbull Чтобы узнать stacktrace нужно-таки остановитьbull В вершине стека может оказаться случайный метод

bull Тем не менее снимать thread dumprsquoы с production раз в 5 минут весьма полезно

20copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на короткой ноге с JVM

honest-profiler

bull Решает проблему safepoint bias

bull Использует недокументированное API AsyncGetCallTrace

bull Пока не готово к production

21copy 2014 NetCracker Technology Corporation Confidential

Может купить какой-нибудь профайлер

Клиент не всегда согласен устанавливать сторонние инструменты

bull Прошлый отрицательный опытbull Цена вопросаbull Чрезмерная общностьbull Сложная адаптация кода к внешнему профайлеру

22copy 2014 NetCracker Technology Corporation Confidential

А что если создать профайлер для себя

23copy 2014 NetCracker Technology Corporation Confidential

Создать профайлер совсем несложно

bull Java byte code един для всех платформ

bull Добавляем methodEntermethodExit в нужные методы и дело в шляпеbull Instrumentation подход очень хорош для 10мс+

методов

24copy 2014 NetCracker Technology Corporation Confidential

MethodEntermethodExit

Варианты добавить профилирующие вызовыbull Вручную править исходный кодbull Javassistbull Aspect oriented programmingbull ASM Objectweb + Instrumentation API

25copy 2014 NetCracker Technology Corporation Confidential

Пишем профайлер за 4 шага

26copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash пишем логгер данных

Пишем логгер

class Profiler public static State methodEnter(int id)

interface State

public void methodExit()

public void logArg(int id String value)

27copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash что нужно от profiler logger

bull Хорошая скорость потоковой записиbull Компактность данныхbull По возможности random-accessbull Возможность экспорта данных за нужный интервал

времени

28copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash где взять логгер

bull Взять готовыйbull Chronicle-Queue Chronicle

bull Создать самимbull DataOutputStream(new GZIPOutputStream(hellip))

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 14: Do it yourself profiler

14copy 2014 NetCracker Technology Corporation Confidential

Есть профайлеры в java мире

15copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на клиенте

bull JavaScript наше измерительное всёbull GY analytics boomerang W3C Navigation timing API

W3C Mutation Observer API

bull HTTPbull accesslogCLIENT DATE TIME METHOD URL CODE SIZE DURATION

1011609 2011-06-14 172824 GET logoutjsp 302 279 0022

16copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа из самого приложения

Немного perf4jlog и у нас лог с замерами

StopWatch watch = new LoggingStopWatch(login)runnablerun()watchstop() how much watch

В логе будет как-то такstart[1415926535898] time[42] tag[login]

17copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Sampling poor mans profilerwatch -n 01 kill -3 pid

bull Каждые 01сек снимаем thread dumpbull И смотрим чем чаще всего занимаются потоки

18copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Смотрим ворох thread dumprsquoов[ACTIVE] ExecuteThread 0 runnable

at javautilzipZipFilegetEntry(Native Method)

at javautilzipZipFilegetEntry

- locked lt0x789162b8gt (a javautilzipZipFile)

at weblogicutilsclassloadersZipClassFindergetSource

at weblogicutilsclassloadersJarClassFindergetSource

at weblogicutilsclassloadersMultiClassFindergetSource

И понимаем что у нас safepoint bias

19copy 2014 NetCracker Technology Corporation Confidential

Safepoint

bull Нельзя просто остановить поток в произвольном местеbull Чтобы узнать stacktrace нужно-таки остановитьbull В вершине стека может оказаться случайный метод

bull Тем не менее снимать thread dumprsquoы с production раз в 5 минут весьма полезно

20copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на короткой ноге с JVM

honest-profiler

bull Решает проблему safepoint bias

bull Использует недокументированное API AsyncGetCallTrace

bull Пока не готово к production

21copy 2014 NetCracker Technology Corporation Confidential

Может купить какой-нибудь профайлер

Клиент не всегда согласен устанавливать сторонние инструменты

bull Прошлый отрицательный опытbull Цена вопросаbull Чрезмерная общностьbull Сложная адаптация кода к внешнему профайлеру

22copy 2014 NetCracker Technology Corporation Confidential

А что если создать профайлер для себя

23copy 2014 NetCracker Technology Corporation Confidential

Создать профайлер совсем несложно

bull Java byte code един для всех платформ

bull Добавляем methodEntermethodExit в нужные методы и дело в шляпеbull Instrumentation подход очень хорош для 10мс+

методов

24copy 2014 NetCracker Technology Corporation Confidential

MethodEntermethodExit

Варианты добавить профилирующие вызовыbull Вручную править исходный кодbull Javassistbull Aspect oriented programmingbull ASM Objectweb + Instrumentation API

25copy 2014 NetCracker Technology Corporation Confidential

Пишем профайлер за 4 шага

26copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash пишем логгер данных

Пишем логгер

class Profiler public static State methodEnter(int id)

interface State

public void methodExit()

public void logArg(int id String value)

27copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash что нужно от profiler logger

bull Хорошая скорость потоковой записиbull Компактность данныхbull По возможности random-accessbull Возможность экспорта данных за нужный интервал

времени

28copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash где взять логгер

bull Взять готовыйbull Chronicle-Queue Chronicle

bull Создать самимbull DataOutputStream(new GZIPOutputStream(hellip))

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 15: Do it yourself profiler

15copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на клиенте

bull JavaScript наше измерительное всёbull GY analytics boomerang W3C Navigation timing API

W3C Mutation Observer API

bull HTTPbull accesslogCLIENT DATE TIME METHOD URL CODE SIZE DURATION

1011609 2011-06-14 172824 GET logoutjsp 302 279 0022

16copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа из самого приложения

Немного perf4jlog и у нас лог с замерами

StopWatch watch = new LoggingStopWatch(login)runnablerun()watchstop() how much watch

В логе будет как-то такstart[1415926535898] time[42] tag[login]

17copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Sampling poor mans profilerwatch -n 01 kill -3 pid

bull Каждые 01сек снимаем thread dumpbull И смотрим чем чаще всего занимаются потоки

18copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Смотрим ворох thread dumprsquoов[ACTIVE] ExecuteThread 0 runnable

at javautilzipZipFilegetEntry(Native Method)

at javautilzipZipFilegetEntry

- locked lt0x789162b8gt (a javautilzipZipFile)

at weblogicutilsclassloadersZipClassFindergetSource

at weblogicutilsclassloadersJarClassFindergetSource

at weblogicutilsclassloadersMultiClassFindergetSource

И понимаем что у нас safepoint bias

19copy 2014 NetCracker Technology Corporation Confidential

Safepoint

bull Нельзя просто остановить поток в произвольном местеbull Чтобы узнать stacktrace нужно-таки остановитьbull В вершине стека может оказаться случайный метод

bull Тем не менее снимать thread dumprsquoы с production раз в 5 минут весьма полезно

20copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на короткой ноге с JVM

honest-profiler

bull Решает проблему safepoint bias

bull Использует недокументированное API AsyncGetCallTrace

bull Пока не готово к production

21copy 2014 NetCracker Technology Corporation Confidential

Может купить какой-нибудь профайлер

Клиент не всегда согласен устанавливать сторонние инструменты

bull Прошлый отрицательный опытbull Цена вопросаbull Чрезмерная общностьbull Сложная адаптация кода к внешнему профайлеру

22copy 2014 NetCracker Technology Corporation Confidential

А что если создать профайлер для себя

23copy 2014 NetCracker Technology Corporation Confidential

Создать профайлер совсем несложно

bull Java byte code един для всех платформ

bull Добавляем methodEntermethodExit в нужные методы и дело в шляпеbull Instrumentation подход очень хорош для 10мс+

методов

24copy 2014 NetCracker Technology Corporation Confidential

MethodEntermethodExit

Варианты добавить профилирующие вызовыbull Вручную править исходный кодbull Javassistbull Aspect oriented programmingbull ASM Objectweb + Instrumentation API

25copy 2014 NetCracker Technology Corporation Confidential

Пишем профайлер за 4 шага

26copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash пишем логгер данных

Пишем логгер

class Profiler public static State methodEnter(int id)

interface State

public void methodExit()

public void logArg(int id String value)

27copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash что нужно от profiler logger

bull Хорошая скорость потоковой записиbull Компактность данныхbull По возможности random-accessbull Возможность экспорта данных за нужный интервал

времени

28copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash где взять логгер

bull Взять готовыйbull Chronicle-Queue Chronicle

bull Создать самимbull DataOutputStream(new GZIPOutputStream(hellip))

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 16: Do it yourself profiler

16copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа из самого приложения

Немного perf4jlog и у нас лог с замерами

StopWatch watch = new LoggingStopWatch(login)runnablerun()watchstop() how much watch

В логе будет как-то такstart[1415926535898] time[42] tag[login]

17copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Sampling poor mans profilerwatch -n 01 kill -3 pid

bull Каждые 01сек снимаем thread dumpbull И смотрим чем чаще всего занимаются потоки

18copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Смотрим ворох thread dumprsquoов[ACTIVE] ExecuteThread 0 runnable

at javautilzipZipFilegetEntry(Native Method)

at javautilzipZipFilegetEntry

- locked lt0x789162b8gt (a javautilzipZipFile)

at weblogicutilsclassloadersZipClassFindergetSource

at weblogicutilsclassloadersJarClassFindergetSource

at weblogicutilsclassloadersMultiClassFindergetSource

И понимаем что у нас safepoint bias

19copy 2014 NetCracker Technology Corporation Confidential

Safepoint

bull Нельзя просто остановить поток в произвольном местеbull Чтобы узнать stacktrace нужно-таки остановитьbull В вершине стека может оказаться случайный метод

bull Тем не менее снимать thread dumprsquoы с production раз в 5 минут весьма полезно

20copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на короткой ноге с JVM

honest-profiler

bull Решает проблему safepoint bias

bull Использует недокументированное API AsyncGetCallTrace

bull Пока не готово к production

21copy 2014 NetCracker Technology Corporation Confidential

Может купить какой-нибудь профайлер

Клиент не всегда согласен устанавливать сторонние инструменты

bull Прошлый отрицательный опытbull Цена вопросаbull Чрезмерная общностьbull Сложная адаптация кода к внешнему профайлеру

22copy 2014 NetCracker Technology Corporation Confidential

А что если создать профайлер для себя

23copy 2014 NetCracker Technology Corporation Confidential

Создать профайлер совсем несложно

bull Java byte code един для всех платформ

bull Добавляем methodEntermethodExit в нужные методы и дело в шляпеbull Instrumentation подход очень хорош для 10мс+

методов

24copy 2014 NetCracker Technology Corporation Confidential

MethodEntermethodExit

Варианты добавить профилирующие вызовыbull Вручную править исходный кодbull Javassistbull Aspect oriented programmingbull ASM Objectweb + Instrumentation API

25copy 2014 NetCracker Technology Corporation Confidential

Пишем профайлер за 4 шага

26copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash пишем логгер данных

Пишем логгер

class Profiler public static State methodEnter(int id)

interface State

public void methodExit()

public void logArg(int id String value)

27copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash что нужно от profiler logger

bull Хорошая скорость потоковой записиbull Компактность данныхbull По возможности random-accessbull Возможность экспорта данных за нужный интервал

времени

28copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash где взять логгер

bull Взять готовыйbull Chronicle-Queue Chronicle

bull Создать самимbull DataOutputStream(new GZIPOutputStream(hellip))

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 17: Do it yourself profiler

17copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Sampling poor mans profilerwatch -n 01 kill -3 pid

bull Каждые 01сек снимаем thread dumpbull И смотрим чем чаще всего занимаются потоки

18copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Смотрим ворох thread dumprsquoов[ACTIVE] ExecuteThread 0 runnable

at javautilzipZipFilegetEntry(Native Method)

at javautilzipZipFilegetEntry

- locked lt0x789162b8gt (a javautilzipZipFile)

at weblogicutilsclassloadersZipClassFindergetSource

at weblogicutilsclassloadersJarClassFindergetSource

at weblogicutilsclassloadersMultiClassFindergetSource

И понимаем что у нас safepoint bias

19copy 2014 NetCracker Technology Corporation Confidential

Safepoint

bull Нельзя просто остановить поток в произвольном местеbull Чтобы узнать stacktrace нужно-таки остановитьbull В вершине стека может оказаться случайный метод

bull Тем не менее снимать thread dumprsquoы с production раз в 5 минут весьма полезно

20copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на короткой ноге с JVM

honest-profiler

bull Решает проблему safepoint bias

bull Использует недокументированное API AsyncGetCallTrace

bull Пока не готово к production

21copy 2014 NetCracker Technology Corporation Confidential

Может купить какой-нибудь профайлер

Клиент не всегда согласен устанавливать сторонние инструменты

bull Прошлый отрицательный опытbull Цена вопросаbull Чрезмерная общностьbull Сложная адаптация кода к внешнему профайлеру

22copy 2014 NetCracker Technology Corporation Confidential

А что если создать профайлер для себя

23copy 2014 NetCracker Technology Corporation Confidential

Создать профайлер совсем несложно

bull Java byte code един для всех платформ

bull Добавляем methodEntermethodExit в нужные методы и дело в шляпеbull Instrumentation подход очень хорош для 10мс+

методов

24copy 2014 NetCracker Technology Corporation Confidential

MethodEntermethodExit

Варианты добавить профилирующие вызовыbull Вручную править исходный кодbull Javassistbull Aspect oriented programmingbull ASM Objectweb + Instrumentation API

25copy 2014 NetCracker Technology Corporation Confidential

Пишем профайлер за 4 шага

26copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash пишем логгер данных

Пишем логгер

class Profiler public static State methodEnter(int id)

interface State

public void methodExit()

public void logArg(int id String value)

27copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash что нужно от profiler logger

bull Хорошая скорость потоковой записиbull Компактность данныхbull По возможности random-accessbull Возможность экспорта данных за нужный интервал

времени

28copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash где взять логгер

bull Взять готовыйbull Chronicle-Queue Chronicle

bull Создать самимbull DataOutputStream(new GZIPOutputStream(hellip))

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 18: Do it yourself profiler

18copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа стохастически

Смотрим ворох thread dumprsquoов[ACTIVE] ExecuteThread 0 runnable

at javautilzipZipFilegetEntry(Native Method)

at javautilzipZipFilegetEntry

- locked lt0x789162b8gt (a javautilzipZipFile)

at weblogicutilsclassloadersZipClassFindergetSource

at weblogicutilsclassloadersJarClassFindergetSource

at weblogicutilsclassloadersMultiClassFindergetSource

И понимаем что у нас safepoint bias

19copy 2014 NetCracker Technology Corporation Confidential

Safepoint

bull Нельзя просто остановить поток в произвольном местеbull Чтобы узнать stacktrace нужно-таки остановитьbull В вершине стека может оказаться случайный метод

bull Тем не менее снимать thread dumprsquoы с production раз в 5 минут весьма полезно

20copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на короткой ноге с JVM

honest-profiler

bull Решает проблему safepoint bias

bull Использует недокументированное API AsyncGetCallTrace

bull Пока не готово к production

21copy 2014 NetCracker Technology Corporation Confidential

Может купить какой-нибудь профайлер

Клиент не всегда согласен устанавливать сторонние инструменты

bull Прошлый отрицательный опытbull Цена вопросаbull Чрезмерная общностьbull Сложная адаптация кода к внешнему профайлеру

22copy 2014 NetCracker Technology Corporation Confidential

А что если создать профайлер для себя

23copy 2014 NetCracker Technology Corporation Confidential

Создать профайлер совсем несложно

bull Java byte code един для всех платформ

bull Добавляем methodEntermethodExit в нужные методы и дело в шляпеbull Instrumentation подход очень хорош для 10мс+

методов

24copy 2014 NetCracker Technology Corporation Confidential

MethodEntermethodExit

Варианты добавить профилирующие вызовыbull Вручную править исходный кодbull Javassistbull Aspect oriented programmingbull ASM Objectweb + Instrumentation API

25copy 2014 NetCracker Technology Corporation Confidential

Пишем профайлер за 4 шага

26copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash пишем логгер данных

Пишем логгер

class Profiler public static State methodEnter(int id)

interface State

public void methodExit()

public void logArg(int id String value)

27copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash что нужно от profiler logger

bull Хорошая скорость потоковой записиbull Компактность данныхbull По возможности random-accessbull Возможность экспорта данных за нужный интервал

времени

28copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash где взять логгер

bull Взять готовыйbull Chronicle-Queue Chronicle

bull Создать самимbull DataOutputStream(new GZIPOutputStream(hellip))

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 19: Do it yourself profiler

19copy 2014 NetCracker Technology Corporation Confidential

Safepoint

bull Нельзя просто остановить поток в произвольном местеbull Чтобы узнать stacktrace нужно-таки остановитьbull В вершине стека может оказаться случайный метод

bull Тем не менее снимать thread dumprsquoы с production раз в 5 минут весьма полезно

20copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на короткой ноге с JVM

honest-profiler

bull Решает проблему safepoint bias

bull Использует недокументированное API AsyncGetCallTrace

bull Пока не готово к production

21copy 2014 NetCracker Technology Corporation Confidential

Может купить какой-нибудь профайлер

Клиент не всегда согласен устанавливать сторонние инструменты

bull Прошлый отрицательный опытbull Цена вопросаbull Чрезмерная общностьbull Сложная адаптация кода к внешнему профайлеру

22copy 2014 NetCracker Technology Corporation Confidential

А что если создать профайлер для себя

23copy 2014 NetCracker Technology Corporation Confidential

Создать профайлер совсем несложно

bull Java byte code един для всех платформ

bull Добавляем methodEntermethodExit в нужные методы и дело в шляпеbull Instrumentation подход очень хорош для 10мс+

методов

24copy 2014 NetCracker Technology Corporation Confidential

MethodEntermethodExit

Варианты добавить профилирующие вызовыbull Вручную править исходный кодbull Javassistbull Aspect oriented programmingbull ASM Objectweb + Instrumentation API

25copy 2014 NetCracker Technology Corporation Confidential

Пишем профайлер за 4 шага

26copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash пишем логгер данных

Пишем логгер

class Profiler public static State methodEnter(int id)

interface State

public void methodExit()

public void logArg(int id String value)

27copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash что нужно от profiler logger

bull Хорошая скорость потоковой записиbull Компактность данныхbull По возможности random-accessbull Возможность экспорта данных за нужный интервал

времени

28copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash где взять логгер

bull Взять готовыйbull Chronicle-Queue Chronicle

bull Создать самимbull DataOutputStream(new GZIPOutputStream(hellip))

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 20: Do it yourself profiler

20copy 2014 NetCracker Technology Corporation Confidential

Измеряем время ответа на короткой ноге с JVM

honest-profiler

bull Решает проблему safepoint bias

bull Использует недокументированное API AsyncGetCallTrace

bull Пока не готово к production

21copy 2014 NetCracker Technology Corporation Confidential

Может купить какой-нибудь профайлер

Клиент не всегда согласен устанавливать сторонние инструменты

bull Прошлый отрицательный опытbull Цена вопросаbull Чрезмерная общностьbull Сложная адаптация кода к внешнему профайлеру

22copy 2014 NetCracker Technology Corporation Confidential

А что если создать профайлер для себя

23copy 2014 NetCracker Technology Corporation Confidential

Создать профайлер совсем несложно

bull Java byte code един для всех платформ

bull Добавляем methodEntermethodExit в нужные методы и дело в шляпеbull Instrumentation подход очень хорош для 10мс+

методов

24copy 2014 NetCracker Technology Corporation Confidential

MethodEntermethodExit

Варианты добавить профилирующие вызовыbull Вручную править исходный кодbull Javassistbull Aspect oriented programmingbull ASM Objectweb + Instrumentation API

25copy 2014 NetCracker Technology Corporation Confidential

Пишем профайлер за 4 шага

26copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash пишем логгер данных

Пишем логгер

class Profiler public static State methodEnter(int id)

interface State

public void methodExit()

public void logArg(int id String value)

27copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash что нужно от profiler logger

bull Хорошая скорость потоковой записиbull Компактность данныхbull По возможности random-accessbull Возможность экспорта данных за нужный интервал

времени

28copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash где взять логгер

bull Взять готовыйbull Chronicle-Queue Chronicle

bull Создать самимbull DataOutputStream(new GZIPOutputStream(hellip))

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 21: Do it yourself profiler

21copy 2014 NetCracker Technology Corporation Confidential

Может купить какой-нибудь профайлер

Клиент не всегда согласен устанавливать сторонние инструменты

bull Прошлый отрицательный опытbull Цена вопросаbull Чрезмерная общностьbull Сложная адаптация кода к внешнему профайлеру

22copy 2014 NetCracker Technology Corporation Confidential

А что если создать профайлер для себя

23copy 2014 NetCracker Technology Corporation Confidential

Создать профайлер совсем несложно

bull Java byte code един для всех платформ

bull Добавляем methodEntermethodExit в нужные методы и дело в шляпеbull Instrumentation подход очень хорош для 10мс+

методов

24copy 2014 NetCracker Technology Corporation Confidential

MethodEntermethodExit

Варианты добавить профилирующие вызовыbull Вручную править исходный кодbull Javassistbull Aspect oriented programmingbull ASM Objectweb + Instrumentation API

25copy 2014 NetCracker Technology Corporation Confidential

Пишем профайлер за 4 шага

26copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash пишем логгер данных

Пишем логгер

class Profiler public static State methodEnter(int id)

interface State

public void methodExit()

public void logArg(int id String value)

27copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash что нужно от profiler logger

bull Хорошая скорость потоковой записиbull Компактность данныхbull По возможности random-accessbull Возможность экспорта данных за нужный интервал

времени

28copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash где взять логгер

bull Взять готовыйbull Chronicle-Queue Chronicle

bull Создать самимbull DataOutputStream(new GZIPOutputStream(hellip))

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 22: Do it yourself profiler

22copy 2014 NetCracker Technology Corporation Confidential

А что если создать профайлер для себя

23copy 2014 NetCracker Technology Corporation Confidential

Создать профайлер совсем несложно

bull Java byte code един для всех платформ

bull Добавляем methodEntermethodExit в нужные методы и дело в шляпеbull Instrumentation подход очень хорош для 10мс+

методов

24copy 2014 NetCracker Technology Corporation Confidential

MethodEntermethodExit

Варианты добавить профилирующие вызовыbull Вручную править исходный кодbull Javassistbull Aspect oriented programmingbull ASM Objectweb + Instrumentation API

25copy 2014 NetCracker Technology Corporation Confidential

Пишем профайлер за 4 шага

26copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash пишем логгер данных

Пишем логгер

class Profiler public static State methodEnter(int id)

interface State

public void methodExit()

public void logArg(int id String value)

27copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash что нужно от profiler logger

bull Хорошая скорость потоковой записиbull Компактность данныхbull По возможности random-accessbull Возможность экспорта данных за нужный интервал

времени

28copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash где взять логгер

bull Взять готовыйbull Chronicle-Queue Chronicle

bull Создать самимbull DataOutputStream(new GZIPOutputStream(hellip))

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 23: Do it yourself profiler

23copy 2014 NetCracker Technology Corporation Confidential

Создать профайлер совсем несложно

bull Java byte code един для всех платформ

bull Добавляем methodEntermethodExit в нужные методы и дело в шляпеbull Instrumentation подход очень хорош для 10мс+

методов

24copy 2014 NetCracker Technology Corporation Confidential

MethodEntermethodExit

Варианты добавить профилирующие вызовыbull Вручную править исходный кодbull Javassistbull Aspect oriented programmingbull ASM Objectweb + Instrumentation API

25copy 2014 NetCracker Technology Corporation Confidential

Пишем профайлер за 4 шага

26copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash пишем логгер данных

Пишем логгер

class Profiler public static State methodEnter(int id)

interface State

public void methodExit()

public void logArg(int id String value)

27copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash что нужно от profiler logger

bull Хорошая скорость потоковой записиbull Компактность данныхbull По возможности random-accessbull Возможность экспорта данных за нужный интервал

времени

28copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash где взять логгер

bull Взять готовыйbull Chronicle-Queue Chronicle

bull Создать самимbull DataOutputStream(new GZIPOutputStream(hellip))

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 24: Do it yourself profiler

24copy 2014 NetCracker Technology Corporation Confidential

MethodEntermethodExit

Варианты добавить профилирующие вызовыbull Вручную править исходный кодbull Javassistbull Aspect oriented programmingbull ASM Objectweb + Instrumentation API

25copy 2014 NetCracker Technology Corporation Confidential

Пишем профайлер за 4 шага

26copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash пишем логгер данных

Пишем логгер

class Profiler public static State methodEnter(int id)

interface State

public void methodExit()

public void logArg(int id String value)

27copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash что нужно от profiler logger

bull Хорошая скорость потоковой записиbull Компактность данныхbull По возможности random-accessbull Возможность экспорта данных за нужный интервал

времени

28copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash где взять логгер

bull Взять готовыйbull Chronicle-Queue Chronicle

bull Создать самимbull DataOutputStream(new GZIPOutputStream(hellip))

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 25: Do it yourself profiler

25copy 2014 NetCracker Technology Corporation Confidential

Пишем профайлер за 4 шага

26copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash пишем логгер данных

Пишем логгер

class Profiler public static State methodEnter(int id)

interface State

public void methodExit()

public void logArg(int id String value)

27copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash что нужно от profiler logger

bull Хорошая скорость потоковой записиbull Компактность данныхbull По возможности random-accessbull Возможность экспорта данных за нужный интервал

времени

28copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash где взять логгер

bull Взять готовыйbull Chronicle-Queue Chronicle

bull Создать самимbull DataOutputStream(new GZIPOutputStream(hellip))

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 26: Do it yourself profiler

26copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash пишем логгер данных

Пишем логгер

class Profiler public static State methodEnter(int id)

interface State

public void methodExit()

public void logArg(int id String value)

27copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash что нужно от profiler logger

bull Хорошая скорость потоковой записиbull Компактность данныхbull По возможности random-accessbull Возможность экспорта данных за нужный интервал

времени

28copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash где взять логгер

bull Взять готовыйbull Chronicle-Queue Chronicle

bull Создать самимbull DataOutputStream(new GZIPOutputStream(hellip))

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 27: Do it yourself profiler

27copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash что нужно от profiler logger

bull Хорошая скорость потоковой записиbull Компактность данныхbull По возможности random-accessbull Возможность экспорта данных за нужный интервал

времени

28copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash где взять логгер

bull Взять готовыйbull Chronicle-Queue Chronicle

bull Создать самимbull DataOutputStream(new GZIPOutputStream(hellip))

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 28: Do it yourself profiler

28copy 2014 NetCracker Technology Corporation Confidential

Шаг 1 ndash где взять логгер

bull Взять готовыйbull Chronicle-Queue Chronicle

bull Создать самимbull DataOutputStream(new GZIPOutputStream(hellip))

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 29: Do it yourself profiler

29copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Нужно примерно следующее

class MyDAO extends NoSQL Object loadObject()

State s = ProfilermethodEnter(42)

try прежний код метода loadObject

finally

smethodExit()

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 30: Do it yourself profiler

30copy 2014 NetCracker Technology Corporation Confidential

Шаг 2 ndash добавляем вызовы логгера в код

Байткод совсем не страшен ASM и вперёд

class ProfilingAdapter extends AdviceAdapter protected void onMethodEnter()

добавляем вызов ProfilermethodEnter()

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 31: Do it yourself profiler

31copy 2014 NetCracker Technology Corporation Confidential

Шаг 3 ndash активируем инструментацию

META-INFMANIFESTMFbull Agent-Class comacmeProfilerbull Can-Redefine-Classes truebull Boot-Class-Path profiler-bootjar

И добавляем параметр запуска JVM

-javaagentpath-to-profilerjar

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 32: Do it yourself profiler

32copy 2014 NetCracker Technology Corporation Confidential

Шаг 4 ndash Пишем UI для просмотра данных

Web приложение для просмотра данных очень удобно

bull Не требуется ставить клиент

bull Без проблем работает отдельно от самого приложения

bull Немного вспоминается laquoкак рисовать совуraquo но SlickGrid и jQuery творят чудеса

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 33: Do it yourself profiler

33copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 34: Do it yourself profiler

34copy 2014 NetCracker Technology Corporation Confidential

Подводные камни

bull Web browserbull Contention Concurrencybull JVMbull OS Hardware

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 35: Do it yourself profiler

35copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Browser

JavaScript работает весьма быстро но

bull Выделить более 1Гб данных в javascript сложноbull Нужно представлять данные компактно (ваш Кэп)

bull Глубина иерархии массивов ограничена ([12[34]hellip])bull Нужно разбивать сильно вложенные структуры

bull Более 100 уровней на экран просто не поместитсяbull Нужно показывать только важные ветви дерева

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 36: Do it yourself profiler

36copy 2014 NetCracker Technology Corporation Confidential

Подводные камни - Contention

Profiler вызывается из разных потоков (surprise) а значит

bull Нужно следить за synchronizedvolatilebull ArrayBlockingQueue (ABQ) вполне хорошо

bull Стоит накопить пачку данных и уже её засылать в ABQ

bull Не забываем про Single Writer Principle и писателю логов живётся хорошо

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 37: Do it yourself profiler

37copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash JVM

bull В java 14 нет Instrumentation API

bull В java 15 Instrumentation не поддерживает native методы

bull В java 16 уже можно инструментировать native методы

bull В java 17 появился Split Verifierbull Добавлять try-catch блоки стало сложнееbull Обновляем ASM и следим за EXPAND_FRAMES

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 38: Do it yourself profiler

38copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь покинуть Омск

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 39: Do it yourself profiler

39copy 2014 NetCracker Technology Corporation Confidential

Подводные камни ndash OS Hardware

Не пытайтесь использовать SystemnanoTime и currentTimeMillis

bull Эти методы очень плохо работают под нагрузкой точностьскорость проседает в 1000 раз

bull Nanotrusting Nanotime

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 40: Do it yourself profiler

40copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

Запускаем поток и пусть он следит за временемclass IAmTimer extends Thread

public static volatile long now

public run()

while(true)

now = SystemcurrentTimeMillis()

sleep(1) На Solaris спит по 10+мс

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 41: Do it yourself profiler

41copy 2014 NetCracker Technology Corporation Confidential

Есть ли жизнь без currentTimeMillis

bull Если sleep(1) длится гораздо больше 1мс то мы что-то подозреваем

GC пауза Swap-in safepoint гранулярность таймера

bull Такие события полезно записывать и отображатьbull jHiccup работает как раз таким образом

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 42: Do it yourself profiler

42copy 2014 NetCracker Technology Corporation Confidential

Складываем вместе и смотрим

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 43: Do it yourself profiler

43copy 2014 NetCracker Technology Corporation Confidential

Что получилось у нас

bull Мы используем профайлер в production

bull Менее 1 увеличение времён отклика

bull 500MiB gzip логов в час с одного узла (4-8 CPU core)

bull Одного log writerrsquoа на JVM пока хватает

bull Профайлер активно используется разработчиками

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 44: Do it yourself profiler

44copy 2014 NetCracker Technology Corporation Confidential

Perf4j + ggplot

С помощью ggplot можно построить хорошие диаграммы из простых perf4j accesslog данных

ggplot(logs) + geom_segment(aes(x=start xend=end) size=2)

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 45: Do it yourself profiler

45copy 2014 NetCracker Technology Corporation Confidential

Свой профайлер всегда доступен

Заходим на profiler и видим было ли приложению laquoплохоraquo

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 46: Do it yourself profiler

46copy 2014 NetCracker Technology Corporation Confidential

Поиск вызова

Поиск нужного вызова

bull По диапазону дат длительности

bull По подстроке

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 47: Do it yourself profiler

47copy 2014 NetCracker Technology Corporation Confidential

Разные страницы ndash разные деревья вызовов

При instrumentation подходе можно рассмотреть каждое дерево независимо

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 48: Do it yourself profiler

48copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов курильщика

В laquoобычномraquo профайлере у дерева нет конца и края

В случае JBoss AS доходило до 1rsquo400 глубины стека

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 49: Do it yourself profiler

49copy 2014 NetCracker Technology Corporation Confidential

Дерево вызовов здорового человека

Мы скрываем незначимые уровни и всё помещается на экран-два-три

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 50: Do it yourself profiler

50copy 2014 NetCracker Technology Corporation Confidential

Легко найти свой код

Каждый разработчик может в 1 click найти свой код

Видноbull Общее количество вызовов getRolesbull Каждый getRoles всегда вызывает findBySQLbull Из 5-и секунд getRoles 29 сек тратилось на ejbStore

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 51: Do it yourself profiler

51copy 2014 NetCracker Technology Corporation Confidential

Черновик экрана hotspots

Первая версия окна hotspots просто время проведённое в методе

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 52: Do it yourself profiler

52copy 2014 NetCracker Technology Corporation Confidential

Hotspots v2

Попробовали и поняли что нужно показывать источник вызовов

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 53: Do it yourself profiler

53copy 2014 NetCracker Technology Corporation Confidential

Поиск источника вызовов

Немного развернём и уже понятна причина

Видноbull Из ProjectTrackingListenerrsquoа было 1473+731 вызов getRolesbull Ещё 5 из ObjectParamersChangeListenerrsquoа

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 54: Do it yourself profiler

54copy 2014 NetCracker Technology Corporation Confidential

Циклы наше всё

В этом же hotspot view видно на каком уровне появляется цикл

Видно что проблема в количестве вызовов getMetricBundle

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 55: Do it yourself profiler

55copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Дерево java методов это круто но в конце концов нужно разделять по видимым клиенту результатам

Примерыbull Шапка ndash 1 сек основная таблица ndash 2 сек copyright ndash 1 секbull Проблема А ndash 2сек проблема Б ndash 1 сек остальное ndash 1 секbull Debug логи ndash 4 сек всё остальное ndash 0 сек

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 56: Do it yourself profiler

56copy 2014 NetCracker Technology Corporation Confidential

Отчёты для PM

Если сделать логическую разбивку то сразу понятно что стоит исправлять сразу а что может подождать

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 57: Do it yourself profiler

57copy 2014 NetCracker Technology Corporation Confidential

laquoИзвестные проблемыraquo

bull В одном дереве часто встречается несколько проблем сразу

bull В каждой ветке top 1 проблема светится больше всего

bull Выход ndash берём и немного правим уже собранные данные

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 58: Do it yourself profiler

58copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Хочется смотреть и быстрые методы а инструментировать слишком накладно

bull Попытка записать каждое обращение к get обречена на провал

bull Если профайлер занимает 90 времени то результат имеет небольшой смысл

bull Особенно для production

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 59: Do it yourself profiler

59copy 2014 NetCracker Technology Corporation Confidential

Что делать с Mapget

Во многих случаях 10-100ms проблемы можно анализировать по простым thread dumprsquoам

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 60: Do it yourself profiler

60copy 2014 NetCracker Technology Corporation Confidential

Открытые вопросы

bull Профилирование памятиbull java 17u40 Java Mission Controlbull java 16u26 ThreadMXBeangetThreadAllocatedBytes

bull JITtednative codebull Solaris Studio Performance Analyzer

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 61: Do it yourself profiler

61copy 2014 NetCracker Technology Corporation Confidential

Выводы

bull Создать профайлер это просто

bull Сделать UI чуть сложнее

bull Профайлер без UI ndash время на ветер

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 62: Do it yourself profiler

62copy 2014 NetCracker Technology Corporation Confidential

Вопросы

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов
Page 63: Do it yourself profiler

63copy 2014 NetCracker Technology Corporation Confidential

Список вызовов

Список вызовов httpserverportprofiler

bull Duration длительность вызоваbull CPU time время потраченное на CPU java потокомbull Suspension длительность торможения сервера (gc swap hellip)bull Calls количество вызовов java методов в деревеbull Transactions количество транзакций с участием JDBCbull Title описание вызова его тип и основные признакиbull Disk IO количество записанныхпрочитанных с диска данныхbull Network IO количество принятыхпереданных по сети данных

  • Профайлер в каждый дом
  • Кто я
  • План
  • Типичный цикл разработки
  • Типичный цикл разработки (2)
  • Критерии оптимизации
  • Зачем жениться профилировать
  • Что ждём от профайлера
  • Что нужно получать помимо длительности
  • Так ведь есть же профайлеры
  • Интеграция профайлера и профилируемого кода
  • Интеграция профайлера и профилируемого кода (2)
  • Интеграция профилируемого кода и профайлера
  • Есть профайлеры в java мире
  • Измеряем время ответа на клиенте
  • Измеряем время ответа из самого приложения
  • Измеряем время ответа стохастически
  • Измеряем время ответа стохастически (2)
  • Safepoint
  • Измеряем время ответа на короткой ноге с JVM
  • Может купить какой-нибудь профайлер
  • А что если создать профайлер для себя
  • Создать профайлер совсем несложно
  • MethodEntermethodExit
  • Пишем профайлер за 4 шага
  • Шаг 1 ndash пишем логгер данных
  • Шаг 1 ndash что нужно от profiler logger
  • Шаг 1 ndash где взять логгер
  • Шаг 2 ndash добавляем вызовы логгера в код
  • Шаг 2 ndash добавляем вызовы логгера в код (2)
  • Шаг 3 ndash активируем инструментацию
  • Шаг 4 ndash Пишем UI для просмотра данных
  • Подводные камни
  • Подводные камни (2)
  • Подводные камни - Browser
  • Подводные камни - Contention
  • Подводные камни ndash JVM
  • Подводные камни ndash OS Hardware
  • Подводные камни ndash OS Hardware (2)
  • Есть ли жизнь без currentTimeMillis
  • Есть ли жизнь без currentTimeMillis (2)
  • Складываем вместе и смотрим
  • Что получилось у нас
  • Perf4j + ggplot
  • Свой профайлер всегда доступен
  • Поиск вызова
  • Разные страницы ndash разные деревья вызовов
  • Дерево вызовов курильщика
  • Дерево вызовов здорового человека
  • Легко найти свой код
  • Черновик экрана hotspots
  • Hotspots v2
  • Поиск источника вызовов
  • Циклы наше всё
  • Отчёты для PM
  • Отчёты для PM (2)
  • laquoИзвестные проблемыraquo
  • Что делать с Mapget
  • Что делать с Mapget (2)
  • Открытые вопросы
  • Выводы
  • Вопросы
  • Список вызовов