do it yourself profiler
DESCRIPTION
В этом докладе рассмотрен опыт NetCracker по выбору инструмента для изучения причин проблем производительности. Рассмотрены критерии по которым не подошли имеющиеся инструменты и показаны примеры того, чего не хватает при анализе результатов обычными профайлерами. http://jokerconf.com/#sitnikovTRANSCRIPT
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-
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)
- Открытые вопросы
- Выводы
- Вопросы
- Список вызовов
-