Ce diaporama a bien été signalé.
Le téléchargement de votre SlideShare est en cours. ×

Implement your own profiler with blackjack and fun

Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité

Consultez-les par la suite

1 sur 113 Publicité

Implement your own profiler with blackjack and fun

Télécharger pour lire hors ligne

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

http://jeeconf.com/program/implement-your-own-profiler-with-blackjack-and-fun/

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

http://jeeconf.com/program/implement-your-own-profiler-with-blackjack-and-fun/

Publicité
Publicité

Plus De Contenu Connexe

Diaporamas pour vous (20)

Publicité

Similaire à Implement your own profiler with blackjack and fun (20)

Plus récents (15)

Publicité

Implement your own profiler with blackjack and fun

  1. 1. © 2016 NetCracker Technology Corporation Confidential Профайлер в каждый дом Владимир Ситников, JEEConf 2016
  2. 2. 2© 2016 NetCracker Technology Corporation Confidential Кто я? Владимир Ситников System Performance @ Netcracker sitnikov@netcracker.com @VladimirSitnikv
  3. 3. 3© 2016 NetCracker Technology Corporation Confidential План • Зачем нужны профайлеры • Зачем создавать свой профайлер, если есть готовое? • Выбираем подход • Sampling vs instrumentation • Пишем • Визуализация и анализ результатов
  4. 4. 4© 2016 NetCracker Technology Corporation Confidential Типичный цикл разработки Разработка Production
  5. 5. 5© 2016 NetCracker Technology Corporation Confidential Типичный цикл разработки Разработка Production
  6. 6. 6© 2016 NetCracker Technology Corporation Confidential Типичный цикл разработки Разработка Production Postmortem optimization is root of all evil
  7. 7. 7© 2016 NetCracker Technology Corporation Confidential Критерии оптимизации Мы будем обсуждать операции по 0.05..5+ сек
  8. 8. 8© 2016 NetCracker Technology Corporation Confidential Зачем жениться профилировать? • Надо, чтобы работало гораздо быстрее
  9. 9. 9© 2016 NetCracker Technology Corporation Confidential Зачем жениться профилировать? • Надо, чтобы работало гораздо быстрее • Сделано должно быть ещё вчера
  10. 10. 10© 2016 NetCracker Technology Corporation Confidential Зачем жениться профилировать? • Надо, чтобы работало гораздо быстрее • Сделано должно быть ещё вчера • Ты попал даже если там всего 1 твоя строка кода
  11. 11. 11© 2016 NetCracker Technology Corporation Confidential Что ждём от профайлера? • Нужно знать какие методы тормозили
  12. 12. 12© 2016 NetCracker Technology Corporation Confidential Что ждём от профайлера? • Нужно знать какие методы тормозили • MyDAO.loadObject • SocketOutputStream.write
  13. 13. 13© 2016 NetCracker Technology Corporation Confidential Что ждём от профайлера? • Нужно знать какие методы тормозили • MyDAO.loadObject • SocketOutputStream.write • Нужно знать какие модули тормозили • Шапка, таблица с результатами
  14. 14. 14© 2016 NetCracker Technology Corporation Confidential Что нужно получать помимо длительности? • Нужно знать что и когда происходило • Имя нажатой кнопки, URL
  15. 15. 15© 2016 NetCracker Technology Corporation Confidential Что нужно получать помимо длительности? • Нужно знать что и когда происходило • Имя нажатой кнопки, URL • Нужно знать контекст • customer ID / order ID / user ID, SQL запросы, параметры к ним и так далее
  16. 16. 16© 2016 NetCracker Technology Corporation Confidential Что нужно получать помимо длительности? • Нужно знать что и когда происходило • Имя нажатой кнопки, URL • Нужно знать контекст • customer ID / order ID / user ID, SQL запросы, параметры к ним и так далее • Нужно уметь заглядывать в прошлое • «У нас вчера было лучше/хуже»
  17. 17. 17© 2016 NetCracker Technology Corporation Confidential Так ведь есть же профайлеры? • Нужно чтобы профайлер был на каждом сервере • DEV/QA/PROD
  18. 18. 18© 2016 NetCracker Technology Corporation Confidential Так ведь есть же профайлеры? • Нужно чтобы профайлер был на каждом сервере • DEV/QA/PROD • Профайлер может потребоваться каждому разработчику • Тут и на лицензиях разориться недолго
  19. 19. 19© 2016 NetCracker Technology Corporation Confidential Так ведь есть же профайлеры? • Нужно чтобы профайлер был на каждом сервере • DEV/QA/PROD • Профайлер может потребоваться каждому разработчику • Тут и на лицензиях разориться недолго • Профайлер должен понимать суть профилируемого • Иначе получим «всё время потрачено в HashMap.get»
  20. 20. 20© 2016 NetCracker Technology Corporation Confidential Интеграция профайлера и профилируемого кода Код должен быть написан с оглядкой на профайлер class UserServlet { private String userName; void doPost() { String userId = ...; Как значения userName и userId попадут в результаты?
  21. 21. 21© 2016 NetCracker Technology Corporation Confidential Интеграция профайлера и профилируемого кода • Нельзя просто взять и поправить старые версии кода • А профилировать всё равно нужно
  22. 22. 22© 2016 NetCracker Technology Corporation Confidential Интеграция профайлера и профилируемого кода • Нельзя просто взять и поправить старые версии кода • А профилировать всё равно нужно • Пока не получишь результат, непонятно где и какие значения нужно захватывать • Цикл «поправили->собрали->выдали» играет против нас
  23. 23. 23© 2016 NetCracker Technology Corporation Confidential Интеграция профилируемого кода и профайлера • Передаём из JMeter специальный HTTP header • Ловим его в профайлере • Анализ результатов нагрузочного теста сильно упрощается
  24. 24. 24© 2014 NetCracker Technology Corporation Confidential Есть профайлеры в java мире!
  25. 25. 25© 2016 NetCracker Technology Corporation Confidential Измеряем время ответа на клиенте • JavaScript наше измерительное всё • G/Y analytics, boomerang, W3C Navigation timing API, W3C Mutation Observer API
  26. 26. 26© 2016 NetCracker Technology Corporation Confidential Измеряем время ответа на клиенте • JavaScript наше измерительное всё • G/Y analytics, boomerang, W3C Navigation timing API, W3C Mutation Observer API • HTTP • access.log CLIENT DATE TIME METHOD URL CODE SIZE DURATION 10.116.0.9 2011-06-14 17:28:24 GET /logout.jsp 302 279 0.022
  27. 27. 27© 2016 NetCracker Technology Corporation Confidential Измеряем время ответа из самого приложения Немного perf4j.log и у нас лог с замерами StopWatch watch = new LoggingStopWatch("login"); runnable.run(); watch.stop(); // how much watch?
  28. 28. 28© 2016 NetCracker Technology Corporation Confidential Измеряем время ответа из самого приложения Немного perf4j.log и у нас лог с замерами StopWatch watch = new LoggingStopWatch("login"); runnable.run(); watch.stop(); // how much watch? В логе будет как-то так: start[1415926535898] time[42] tag[login]
  29. 29. 29© 2016 NetCracker Technology Corporation Confidential Измеряем время ответа стохастически Sampling: poor man's profiler watch -n 0.1 kill -3 pid
  30. 30. 30© 2016 NetCracker Technology Corporation Confidential Измеряем время ответа стохастически Sampling: poor man's profiler watch -n 0.1 kill -3 pid • Каждые 0.1сек снимаем thread dump • И смотрим чем чаще всего занимаются потоки
  31. 31. 31© 2016 NetCracker Technology Corporation Confidential Измеряем время ответа стохастически Смотрим ворох thread dump’ов "[ACTIVE] ExecuteThread: '0' ... runnable ... at java.util.zip.ZipFile.getEntry(Native Method) at java.util.zip.ZipFile.getEntry - locked <0x789162b8> (a java.util.zip.ZipFile) at weblogic.utils.classloaders.ZipClassFinder.getSource at weblogic.utils.classloaders.JarClassFinder.getSource at weblogic.utils.classloaders.MultiClassFinder.getSource
  32. 32. 32© 2016 NetCracker Technology Corporation Confidential Измеряем время ответа стохастически Смотрим ворох thread dump’ов "[ACTIVE] ExecuteThread: '0' ... runnable ... at java.util.zip.ZipFile.getEntry(Native Method) at java.util.zip.ZipFile.getEntry - locked <0x789162b8> (a java.util.zip.ZipFile) at weblogic.utils.classloaders.ZipClassFinder.getSource at weblogic.utils.classloaders.JarClassFinder.getSource at weblogic.utils.classloaders.MultiClassFinder.getSource И понимаем, что у нас safepoint bias
  33. 33. 33© 2016 NetCracker Technology Corporation Confidential Safepoint • Нельзя просто остановить поток в произвольном месте • Чтобы узнать stacktrace нужно-таки остановить • В вершине стека может оказаться случайный метод
  34. 34. 34© 2016 NetCracker Technology Corporation Confidential Safepoint • Нельзя просто остановить поток в произвольном месте • Чтобы узнать stacktrace нужно-таки остановить • В вершине стека может оказаться случайный метод • Тем не менее, снимать thread dump’ы с production раз в 5 минут весьма полезно
  35. 35. 35© 2016 NetCracker Technology Corporation Confidential Измеряем время ответа на короткой ноге с JVM honest-profiler • Решает проблему safepoint bias • Использует недокументированное API: AsyncGetCallTrace
  36. 36. 36© 2016 NetCracker Technology Corporation Confidential Измеряем время ответа на короткой ноге с JVM honest-profiler • Решает проблему safepoint bias • Использует недокументированное API: AsyncGetCallTrace • Пока не готово к production 
  37. 37. 37© 2016 NetCracker Technology Corporation Confidential Может, купить какой-нибудь профайлер? Клиент не всегда согласен устанавливать сторонние инструменты
  38. 38. 38© 2016 NetCracker Technology Corporation Confidential Может, купить какой-нибудь профайлер? Клиент не всегда согласен устанавливать сторонние инструменты • Прошлый отрицательный опыт
  39. 39. 39© 2016 NetCracker Technology Corporation Confidential Может, купить какой-нибудь профайлер? Клиент не всегда согласен устанавливать сторонние инструменты • Прошлый отрицательный опыт • Цена вопроса
  40. 40. 40© 2016 NetCracker Technology Corporation Confidential Может, купить какой-нибудь профайлер? Клиент не всегда согласен устанавливать сторонние инструменты • Прошлый отрицательный опыт • Цена вопроса • Чрезмерная общность • Сложная адаптация кода к внешнему профайлеру
  41. 41. 41© 2014 NetCracker Technology Corporation Confidential А что если создать профайлер для себя?
  42. 42. 42© 2016 NetCracker Technology Corporation Confidential Создать профайлер совсем несложно • Java byte code един для всех платформ
  43. 43. 43© 2016 NetCracker Technology Corporation Confidential Создать профайлер совсем несложно • Java byte code един для всех платформ • Добавляем methodEnter/methodExit в нужные методы и дело в шляпе!
  44. 44. 44© 2016 NetCracker Technology Corporation Confidential Создать профайлер совсем несложно • Java byte code един для всех платформ • Добавляем methodEnter/methodExit в нужные методы и дело в шляпе! • Instrumentation подход очень хорош для 10мс+ методов
  45. 45. 45© 2016 NetCracker Technology Corporation Confidential MethodEnter/methodExit Варианты добавить профилирующие вызовы: • Вручную править исходный код
  46. 46. 46© 2016 NetCracker Technology Corporation Confidential MethodEnter/methodExit Варианты добавить профилирующие вызовы: • Вручную править исходный код • Javassist
  47. 47. 47© 2016 NetCracker Technology Corporation Confidential MethodEnter/methodExit Варианты добавить профилирующие вызовы: • Вручную править исходный код • Javassist • Aspect oriented programming
  48. 48. 48© 2016 NetCracker Technology Corporation Confidential MethodEnter/methodExit Варианты добавить профилирующие вызовы: • Вручную править исходный код • Javassist • Aspect oriented programming • ASM Objectweb + Instrumentation API
  49. 49. 49© 2014 NetCracker Technology Corporation Confidential Пишем профайлер за 4 шага
  50. 50. 50© 2016 NetCracker Technology Corporation Confidential Шаг 1 – пишем логгер данных Пишем логгер class Profiler { public static State methodEnter(int id); } interface State { public void methodExit(); public void logArg(int id, String value); }
  51. 51. 51© 2016 NetCracker Technology Corporation Confidential Шаг 1 – что нужно от profiler logger? • Хорошая скорость потоковой записи
  52. 52. 52© 2016 NetCracker Technology Corporation Confidential Шаг 1 – что нужно от profiler logger? • Хорошая скорость потоковой записи • Компактность данных
  53. 53. 53© 2016 NetCracker Technology Corporation Confidential Шаг 1 – что нужно от profiler logger? • Хорошая скорость потоковой записи • Компактность данных • По возможности, random-access
  54. 54. 54© 2016 NetCracker Technology Corporation Confidential Шаг 1 – что нужно от profiler logger? • Хорошая скорость потоковой записи • Компактность данных • По возможности, random-access • Возможность экспорта данных за нужный интервал времени
  55. 55. 55© 2016 NetCracker Technology Corporation Confidential Шаг 1 – где взять логгер? • Взять готовый • Chronicle-Queue / Chronicle
  56. 56. 56© 2016 NetCracker Technology Corporation Confidential Шаг 1 – где взять логгер? • Взять готовый • Chronicle-Queue / Chronicle • Создать самим • DataOutputStream(new GZIPOutputStream(…))
  57. 57. 57© 2016 NetCracker Technology Corporation Confidential GZIPOutputStream.flush • Данные терять не хотим – вызываем flush
  58. 58. 58© 2016 NetCracker Technology Corporation Confidential GZIPOutputStream.flush • Данные терять не хотим – вызываем flush • Но GZIPOutputStream.flush не работает!
  59. 59. 59© 2016 NetCracker Technology Corporation Confidential GZIPOutputStream.flush • Данные терять не хотим – вызываем flush • Но GZIPOutputStream.flush не работает! • Поэтому Deflater def; def.setInput(EMPTYBYTEARRAY, 0, 0); def.setLevel(Deflater.NO_COMPRESSION); deflate(); def.setLevel(Deflater.DEFAULT_COMPRESSION); deflate(); ...
  60. 60. 60© 2016 NetCracker Technology Corporation Confidential Шаг 2 – добавляем вызовы логгера в код Нужно примерно следующее: class MyDAO extends NoSQL { Object loadObject() { State s = Profiler.methodEnter(42); try { // прежний код метода loadObject } finally { s.methodExit(); ...
  61. 61. 61© 2016 NetCracker Technology Corporation Confidential Шаг 2 – добавляем вызовы логгера в код Байткод совсем не страшен: ASM и вперёд class ProfilingAdapter extends AdviceAdapter { protected void onMethodEnter() { добавляем вызов Profiler.methodEnter(); } }
  62. 62. 62© 2016 NetCracker Technology Corporation Confidential Шаг 3 – активируем инструментацию META-INF/MANIFEST.MF • Agent-Class: com.acme.Profiler • Can-Redefine-Classes: true • Boot-Class-Path: profiler-boot.jar И добавляем параметр запуска JVM -javaagent:path-to-profiler.jar
  63. 63. 63© 2016 NetCracker Technology Corporation Confidential Шаг 4 – Пишем UI для просмотра данных Web приложение для просмотра данных очень удобно: • Не требуется ставить клиент
  64. 64. 64© 2016 NetCracker Technology Corporation Confidential Шаг 4 – Пишем UI для просмотра данных Web приложение для просмотра данных очень удобно: • Не требуется ставить клиент • Без проблем работает отдельно от самого приложения
  65. 65. 65© 2016 NetCracker Technology Corporation Confidential Шаг 4 – Пишем UI для просмотра данных Web приложение для просмотра данных очень удобно: • Не требуется ставить клиент • Без проблем работает отдельно от самого приложения • Немного вспоминается «как рисовать сову», но SlickGrid и jQuery творят чудеса
  66. 66. 66© 2014 NetCracker Technology Corporation Confidential Подводные камни
  67. 67. 67© 2016 NetCracker Technology Corporation Confidential Подводные камни • Web browser • Contention / Concurrency • JVM • OS / Hardware
  68. 68. 68© 2016 NetCracker Technology Corporation Confidential Подводные камни - Browser JavaScript работает весьма быстро, но • Выделить более 1Гб данных в javascript сложно • Нужно представлять данные компактно (ваш Кэп)
  69. 69. 69© 2016 NetCracker Technology Corporation Confidential Подводные камни - Browser JavaScript работает весьма быстро, но • Выделить более 1Гб данных в javascript сложно • Нужно представлять данные компактно (ваш Кэп) • Глубина иерархии массивов ограничена ([1,2,[3,4],…]) • Нужно разбивать сильно вложенные структуры
  70. 70. 70© 2016 NetCracker Technology Corporation Confidential Подводные камни - Browser JavaScript работает весьма быстро, но • Выделить более 1Гб данных в javascript сложно • Нужно представлять данные компактно (ваш Кэп) • Глубина иерархии массивов ограничена ([1,2,[3,4],…]) • Нужно разбивать сильно вложенные структуры • Более 100 уровней на экран просто не поместится • Нужно показывать только важные ветви дерева
  71. 71. 71© 2016 NetCracker Technology Corporation Confidential Подводные камни - Contention Profiler вызывается из разных потоков (surprise!), а значит:
  72. 72. 72© 2016 NetCracker Technology Corporation Confidential Подводные камни - Contention Profiler вызывается из разных потоков (surprise!), а значит: • Нужно следить за synchronized/volatile • ArrayBlockingQueue (ABQ) вполне хорошо
  73. 73. 73© 2016 NetCracker Technology Corporation Confidential Подводные камни - Contention Profiler вызывается из разных потоков (surprise!), а значит: • Нужно следить за synchronized/volatile • ArrayBlockingQueue (ABQ) вполне хорошо • Стоит накопить пачку данных и уже её засылать в ABQ
  74. 74. 74© 2016 NetCracker Technology Corporation Confidential Подводные камни - Contention Profiler вызывается из разных потоков (surprise!), а значит: • Нужно следить за synchronized/volatile • ArrayBlockingQueue (ABQ) вполне хорошо • Стоит накопить пачку данных и уже её засылать в ABQ • Не забываем про Single Writer Principle и писателю логов живётся хорошо
  75. 75. 75© 2016 NetCracker Technology Corporation Confidential Подводные камни – JVM • В java 1.4 нет Instrumentation API
  76. 76. 76© 2016 NetCracker Technology Corporation Confidential Подводные камни – JVM • В java 1.4 нет Instrumentation API • В java 1.5 Instrumentation не поддерживает native методы
  77. 77. 77© 2016 NetCracker Technology Corporation Confidential Подводные камни – JVM • В java 1.4 нет Instrumentation API • В java 1.5 Instrumentation не поддерживает native методы • В java 1.6 уже можно инструментировать native методы
  78. 78. 78© 2016 NetCracker Technology Corporation Confidential Подводные камни – JVM • В java 1.4 нет Instrumentation API • В java 1.5 Instrumentation не поддерживает native методы • В java 1.6 уже можно инструментировать native методы • В java 1.7 появился Split Verifier • Добавлять try-catch блоки стало сложнее • Обновляем ASM и следим за EXPAND_FRAMES
  79. 79. 79© 2016 NetCracker Technology Corporation Confidential Подводные камни – OS / Hardware Не пытайтесь покинуть Омск
  80. 80. 80© 2016 NetCracker Technology Corporation Confidential Подводные камни – OS / Hardware Не пытайтесь использовать System.nanoTime и currentTimeMillis • Эти методы очень плохо работают под нагрузкой: точность/скорость проседает в 1000 раз • Nanotrusting Nanotime:
  81. 81. 81© 2016 NetCracker Technology Corporation Confidential Есть ли жизнь без currentTimeMillis? Запускаем поток, и пусть он следит за временем: class IAmTimer extends Thread { public static volatile long now; public run() { while(true) { now = System.currentTimeMillis(); sleep(1); // На Solaris спит по 10+мс
  82. 82. 82© 2016 NetCracker Technology Corporation Confidential Есть ли жизнь без currentTimeMillis? • Если sleep(1) длится гораздо больше 1мс, то мы что-то подозреваем: GC пауза, Swap-in, safepoint, гранулярность таймера • Такие события полезно записывать и отображать • jHiccup работает как раз таким образом
  83. 83. 83© 2014 NetCracker Technology Corporation Confidential Складываем вместе и смотрим
  84. 84. 84© 2016 NetCracker Technology Corporation Confidential Метод последовательных улучшений
  85. 85. 85© 2016 NetCracker Technology Corporation Confidential Что получилось у нас • Мы используем профайлер в production
  86. 86. 86© 2016 NetCracker Technology Corporation Confidential Что получилось у нас • Мы используем профайлер в production • Менее 1% увеличение времён отклика
  87. 87. 87© 2016 NetCracker Technology Corporation Confidential Что получилось у нас • Мы используем профайлер в production • Менее 1% увеличение времён отклика • 500MiB gzip логов в час с одного узла (4-8 CPU core)
  88. 88. 88© 2016 NetCracker Technology Corporation Confidential Что получилось у нас • Мы используем профайлер в production • Менее 1% увеличение времён отклика • 500MiB gzip логов в час с одного узла (4-8 CPU core) • Одного log writer’а на JVM пока хватает
  89. 89. 89© 2016 NetCracker Technology Corporation Confidential Что получилось у нас • Мы используем профайлер в production • Менее 1% увеличение времён отклика • 500MiB gzip логов в час с одного узла (4-8 CPU core) • Одного log writer’а на JVM пока хватает • Профайлер активно используется разработчиками
  90. 90. 90© 2016 NetCracker Technology Corporation Confidential Perf4j + ggplot С помощью ggplot можно построить хорошие диаграммы из простых perf4j / access.log данных ggplot(logs) + geom_segment(aes(x=start, xend=end), size=2)
  91. 91. 91© 2016 NetCracker Technology Corporation Confidential Свой профайлер всегда доступен Заходим на /profiler и видим было ли приложению «плохо»
  92. 92. 92© 2016 NetCracker Technology Corporation Confidential Поиск вызова Поиск нужного вызова: • По диапазону дат, длительности • По подстроке
  93. 93. 93© 2016 NetCracker Technology Corporation Confidential Разные страницы – разные деревья вызовов При instrumentation подходе можно рассмотреть каждое дерево независимо
  94. 94. 94© 2016 NetCracker Technology Corporation Confidential Дерево вызовов курильщика В «обычном» профайлере у дерева нет конца и края: В случае JBoss AS доходило до 1’400 глубины стека 
  95. 95. 95© 2016 NetCracker Technology Corporation Confidential Дерево вызовов здорового человека Мы скрываем незначимые уровни и всё помещается на экран-два-три:
  96. 96. 96© 2016 NetCracker Technology Corporation Confidential Легко найти свой код Каждый разработчик может в 1 click найти свой код Видно: • Общее количество вызовов getRoles • Каждый getRoles всегда вызывает findBySQL • Из 5-и секунд getRoles 2.9 сек тратилось на ejbStore
  97. 97. 97© 2016 NetCracker Technology Corporation Confidential Черновик экрана hotspots Первая версия окна hotspots: просто время, проведённое в методе
  98. 98. 98© 2016 NetCracker Technology Corporation Confidential Hotspots v2 Попробовали и поняли, что нужно показывать источник вызовов
  99. 99. 99© 2016 NetCracker Technology Corporation Confidential Поиск источника вызовов Немного развернём и уже понятна причина Видно: • Из ProjectTrackingListener’а было 1473+731 вызов getRoles • Ещё 5 из ObjectParamersChangeListener’а
  100. 100. 100© 2016 NetCracker Technology Corporation Confidential Циклы наше всё В этом же hotspot view видно на каком уровне появляется цикл Видно, что проблема в количестве вызовов getMetricBundle
  101. 101. 101© 2016 NetCracker Technology Corporation Confidential Отчёты для PM Дерево java методов это круто, но в конце концов нужно разделять по видимым клиенту результатам Примеры: • Шапка – 1 сек, основная таблица – 2 сек, copyright – 1 сек • Проблема А – 2сек, проблема Б – 1 сек, остальное – 1 сек • Debug логи – 4 сек, всё остальное – 0 сек
  102. 102. 102© 2016 NetCracker Technology Corporation Confidential Отчёты для PM Если сделать логическую разбивку, то сразу понятно что стоит исправлять сразу, а что может подождать:
  103. 103. 103© 2016 NetCracker Technology Corporation Confidential «Известные проблемы» • В одном дереве часто встречается несколько проблем сразу
  104. 104. 104© 2016 NetCracker Technology Corporation Confidential «Известные проблемы» • В одном дереве часто встречается несколько проблем сразу • В каждой ветке top 1 проблема светится больше всего
  105. 105. 105© 2016 NetCracker Technology Corporation Confidential «Известные проблемы» • В одном дереве часто встречается несколько проблем сразу • В каждой ветке top 1 проблема светится больше всего • Выход – берём и немного правим уже собранные данные
  106. 106. 106© 2016 NetCracker Technology Corporation Confidential Что делать с Map.get? Хочется смотреть и быстрые методы, а инструментировать слишком накладно • Попытка записать каждое обращение к .get обречена на провал
  107. 107. 107© 2016 NetCracker Technology Corporation Confidential Что делать с Map.get? Хочется смотреть и быстрые методы, а инструментировать слишком накладно • Попытка записать каждое обращение к .get обречена на провал • Если профайлер занимает 90% времени, то результат имеет небольшой смысл
  108. 108. 108© 2016 NetCracker Technology Corporation Confidential Что делать с Map.get? Хочется смотреть и быстрые методы, а инструментировать слишком накладно • Попытка записать каждое обращение к .get обречена на провал • Если профайлер занимает 90% времени, то результат имеет небольшой смысл • Особенно для production
  109. 109. 109© 2016 NetCracker Technology Corporation Confidential Что делать с Map.get? Во многих случаях 10-100ms проблемы можно анализировать по простым thread dump’ам
  110. 110. 110© 2016 NetCracker Technology Corporation Confidential Открытые вопросы • JITted/native code • Java Mission Control -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints • Solaris Studio Performance Analyzer
  111. 111. 111© 2016 NetCracker Technology Corporation Confidential Открытые вопросы • Профилирование памяти • java 1.7u40: Java Mission Control • java 1.6u26: ThreadMXBean.getThreadAllocatedBytes
  112. 112. 112© 2016 NetCracker Technology Corporation Confidential Выводы • Создать профайлер это просто • Сделать UI чуть сложнее • Профайлер без UI – время на ветер
  113. 113. 113© 2014 NetCracker Technology Corporation Confidential Вопросы?

×