SlideShare ist ein Scribd-Unternehmen logo
1 von 63
Профайлер в каждый дом 
© 2014 NetCracker Technology Corporation Confidential 
Владимир Ситников
© 2014 NetCracker Technology Corporation Confidential 2 
Кто я? 
Владимир Ситников 
System Performance @ NetCracker 
sitnikov@netcracker.com 
@VladimirSitnikv
© 2014 NetCracker Technology Corporation Confidential 3 
План 
• Зачем нужны профайлеры 
• Зачем создавать свой профайлер, если есть готовое? 
• Выбираем подход 
• Sampling vs instrumentation 
• Пишем 
• Визуализация и анализ результатов
Типичный цикл разработки 
Разработка Production 
© 2014 NetCracker Technology Corporation Confidential 4
Типичный цикл разработки 
Разработка Production 
Postmortem 
optimization is 
root of all evil 
© 2014 NetCracker Technology Corporation Confidential 5
Критерии оптимизации 
Мы будем обсуждать операции по 0.05..5+ сек 
© 2014 NetCracker Technology Corporation Confidential 6
Зачем жениться профилировать? 
• Надо, чтобы работало гораздо быстрее 
• Сделано должно быть ещё вчера 
• Ты попал даже если там всего 1 твоя строка кода 
© 2014 NetCracker Technology Corporation Confidential 7
Что ждём от профайлера? 
• Нужно знать какие методы тормозили 
• MyDAO.loadObject 
• SocketOutputStream.write 
• Нужно знать какие модули тормозили 
• Шапка, таблица с результатами 
© 2014 NetCracker Technology Corporation Confidential 8
Что нужно получать помимо длительности? 
• Нужно знать что и когда происходило 
• Имя нажатой кнопки, URL 
• Нужно знать контекст 
• customer ID / order ID / user ID, SQL запросы, 
параметры к ним и так далее 
• Нужно уметь заглядывать в прошлое 
• «У нас вчера было лучше/хуже» 
© 2014 NetCracker Technology Corporation Confidential 9
Так ведь есть же профайлеры? 
• Нужно чтобы профайлер был на каждом сервере 
• DEV/QA/PROD 
• Профайлер может потребоваться каждому разработчику 
• Тут и на лицензиях разориться недолго 
• Профайлер должен понимать суть профилируемого 
• Иначе получим «всё время потрачено в HashMap.get» 
© 2014 NetCracker Technology Corporation Confidential 10
Интеграция профайлера и профилируемого кода 
Код должен быть написан с оглядкой на профайлер 
class UserServlet { 
private String userName; 
void doPost() { 
String userId = ...; 
Как значения userName 
и userId попадут в 
результаты? 
© 2014 NetCracker Technology Corporation Confidential 11
Интеграция профайлера и профилируемого кода 
• Нельзя просто взять и поправить старые версии кода 
• А профилировать всё равно нужно 
• Пока не получишь результат, непонятно где и какие 
значения нужно захватывать 
• Цикл «поправили->собрали->выдали» играет против 
нас 
© 2014 NetCracker Technology Corporation Confidential 12
Интеграция профилируемого кода и профайлера 
• Передаём из JMeter специальный HTTP header 
• Ловим его в профайлере 
• Анализ результатов нагрузочного теста сильно 
упрощается 
© 2014 NetCracker Technology Corporation Confidential 13
Есть профайлеры в java мире! 
© 2014 NetCracker Technology Corporation Confidential 14
Измеряем время ответа на клиенте 
• 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 
© 2014 NetCracker Technology Corporation Confidential 15
Измеряем время ответа из самого приложения 
Немного perf4j.log и у нас лог с замерами 
StopWatch watch = new LoggingStopWatch("login"); 
runnable.run(); 
watch.stop(); // how much watch? 
В логе будет как-то так: 
start[1415926535898] time[42] tag[login] 
© 2014 NetCracker Technology Corporation Confidential 16
Измеряем время ответа стохастически 
Sampling: poor man's profiler 
watch -n 0.1 kill -3 pid 
• Каждые 0.1сек снимаем thread dump 
• И смотрим чем чаще всего занимаются потоки 
© 2014 NetCracker Technology Corporation Confidential 17
Измеряем время ответа стохастически 
Смотрим ворох 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 
© 2014 NetCracker Technology Corporation Confidential 18
Safepoint 
• Нельзя просто остановить поток в произвольном 
месте 
• Чтобы узнать stacktrace нужно-таки остановить 
• В вершине стека может оказаться случайный метод 
• Тем не менее, снимать thread dump’ы с production раз 
в 5 минут весьма полезно 
© 2014 NetCracker Technology Corporation Confidential 19
Измеряем время ответа на короткой ноге с JVM 
honest-profiler 
• Решает проблему safepoint bias 
• Использует недокументированное API: 
AsyncGetCallTrace 
• Пока не готово к production  
© 2014 NetCracker Technology Corporation Confidential 20
Может, купить какой-нибудь профайлер? 
Клиент не всегда согласен устанавливать сторонние 
инструменты 
• Прошлый отрицательный опыт 
• Цена вопроса 
• Чрезмерная общность 
• Сложная адаптация кода к внешнему профайлеру 
© 2014 NetCracker Technology Corporation Confidential 21
А что если создать профайлер для себя? 
© 2014 NetCracker Technology Corporation Confidential 22
Создать профайлер совсем несложно 
• Java byte code един для всех платформ 
• Добавляем methodEnter/methodExit в нужные методы 
и дело в шляпе! 
• Instrumentation подход очень хорош для 10мс+ 
методов 
© 2014 NetCracker Technology Corporation Confidential 23
MethodEnter/methodExit 
Варианты добавить профилирующие вызовы: 
• Вручную править исходный код 
• Javassist 
• Aspect oriented programming 
• ASM Objectweb + Instrumentation API 
© 2014 NetCracker Technology Corporation Confidential 24
Пишем профайлер за 4 шага 
© 2014 NetCracker Technology Corporation Confidential 25
Шаг 1 – пишем логгер данных 
Пишем логгер 
class Profiler { 
public static State methodEnter(int id); 
} 
interface State { 
public void methodExit(); 
public void logArg(int id, String value); 
© 2014 NetCracker Technology Corporation Confidential 26 
}
Шаг 1 – что нужно от profiler logger? 
• Хорошая скорость потоковой записи 
• Компактность данных 
• По возможности, random-access 
• Возможность экспорта данных за нужный интервал 
времени 
© 2014 NetCracker Technology Corporation Confidential 27
Шаг 1 – где взять логгер? 
• Взять готовый 
• Chronicle-Queue / Chronicle 
• Создать самим 
• DataOutputStream(new GZIPOutputStream(…)) 
© 2014 NetCracker Technology Corporation Confidential 28
Шаг 2 – добавляем вызовы логгера в код 
Нужно примерно следующее: 
class MyDAO extends NoSQL { 
Object loadObject() { 
State s = Profiler.methodEnter(42); 
try { 
// прежний код метода loadObject 
} finally { 
s.methodExit(); ... 
© 2014 NetCracker Technology Corporation Confidential 29
Шаг 2 – добавляем вызовы логгера в код 
Байткод совсем не страшен: ASM и вперёд 
class ProfilingAdapter extends AdviceAdapter 
{ 
protected void onMethodEnter() 
{ 
добавляем вызов Profiler.methodEnter(); 
© 2014 NetCracker Technology Corporation Confidential 30 
} 
}
Шаг 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 
© 2014 NetCracker Technology Corporation Confidential 31
Шаг 4 – Пишем UI для просмотра данных 
Web приложение для просмотра данных очень удобно: 
• Не требуется ставить клиент 
• Без проблем работает отдельно от самого 
приложения 
• Немного вспоминается «как рисовать сову», но 
SlickGrid и jQuery творят чудеса 
© 2014 NetCracker Technology Corporation Confidential 32
Подводные камни 
© 2014 NetCracker Technology Corporation Confidential 33
Подводные камни 
•Web browser 
• Contention / Concurrency 
• JVM 
• OS / Hardware 
© 2014 NetCracker Technology Corporation Confidential 34
Подводные камни - Browser 
JavaScript работает весьма быстро, но 
• Выделить более 1Гб данных в javascript сложно 
• Нужно представлять данные компактно (ваш Кэп) 
• Глубина иерархии массивов ограничена ([1,2,[3,4],…]) 
• Нужно разбивать сильно вложенные структуры 
• Более 100 уровней на экран просто не поместится 
• Нужно показывать только важные ветви дерева 
© 2014 NetCracker Technology Corporation Confidential 35
Подводные камни - Contention 
Profiler вызывается из разных потоков (surprise!), а 
значит: 
• Нужно следить за synchronized/volatile 
• ArrayBlockingQueue (ABQ) вполне хорошо 
• Стоит накопить пачку данных и уже её засылать в ABQ 
• Не забываем про Single Writer Principle и писателю 
логов живётся хорошо 
© 2014 NetCracker Technology Corporation Confidential 36
Подводные камни – 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 
© 2014 NetCracker Technology Corporation Confidential 37
Подводные камни – OS / Hardware 
Не пытайтесь покинуть Омск 
© 2014 NetCracker Technology Corporation Confidential 38
Подводные камни – OS / Hardware 
Не пытайтесь использовать System.nanoTime и 
currentTimeMillis 
• Эти методы очень плохо работают под нагрузкой: 
точность/скорость проседает в 1000 раз 
• Nanotrusting Nanotime: 
© 2014 NetCracker Technology Corporation Confidential 39
Есть ли жизнь без currentTimeMillis? 
Запускаем поток, и пусть он следит за временем: 
class IAmTimer extends Thread { 
public static volatile long now; 
public run() { 
while(true) { 
now = System.currentTimeMillis(); 
sleep(1); // На Solaris спит по 10+мс 
© 2014 NetCracker Technology Corporation Confidential 40
Есть ли жизнь без currentTimeMillis? 
• Если sleep(1) длится гораздо больше 1мс, то мы что-то 
подозреваем: 
GC пауза, Swap-in, safepoint, гранулярность таймера 
• Такие события полезно записывать и отображать 
• jHiccup работает как раз таким образом 
© 2014 NetCracker Technology Corporation Confidential 41
Складываем вместе и смотрим 
© 2014 NetCracker Technology Corporation Confidential 42
Что получилось у нас 
• Мы используем профайлер в production 
• Менее 1% увеличение времён отклика 
• 500MiB gzip логов в час с одного узла (4-8 CPU core) 
• Одного log writer’а на JVM пока хватает 
• Профайлер активно используется разработчиками 
© 2014 NetCracker Technology Corporation Confidential 43
Perf4j + ggplot 
С помощью ggplot можно построить хорошие диаграммы из 
простых perf4j / access.log данных 
ggplot(logs) + geom_segment(aes(x=start, xend=end), size=2) 
© 2014 NetCracker Technology Corporation Confidential 44
Свой профайлер всегда доступен 
Заходим на /profiler и видим было ли приложению «плохо» 
© 2014 NetCracker Technology Corporation Confidential 45
Поиск вызова 
Поиск нужного вызова: 
• По диапазону дат, длительности 
• По подстроке 
© 2014 NetCracker Technology Corporation Confidential 46
Разные страницы – разные деревья вызовов 
При instrumentation подходе можно рассмотреть каждое дерево независимо 
© 2014 NetCracker Technology Corporation Confidential 47
Дерево вызовов курильщика 
В «обычном» профайлере у дерева нет конца и края: 
В случае JBoss AS доходило до 1’400 глубины стека  
© 2014 NetCracker Technology Corporation Confidential 48
Дерево вызовов здорового человека 
Мы скрываем незначимые уровни и всё помещается на 
экран-два-три: 
© 2014 NetCracker Technology Corporation Confidential 49
Легко найти свой код 
Каждый разработчик может в 1 click найти свой код 
Видно: 
• Общее количество вызовов getRoles 
• Каждый getRoles всегда вызывает findBySQL 
• Из 5-и секунд getRoles 2.9 сек тратилось на ejbStore 
© 2014 NetCracker Technology Corporation Confidential 50
Черновик экрана hotspots 
Первая версия окна hotspots: просто время, проведённое в 
методе 
© 2014 NetCracker Technology Corporation Confidential 51
Hotspots v2 
Попробовали и поняли, что нужно показывать источник 
вызовов 
© 2014 NetCracker Technology Corporation Confidential 52
Поиск источника вызовов 
Немного развернём и уже понятна причина 
Видно: 
• Из ProjectTrackingListener’а было 1473+731 вызов getRoles 
• Ещё 5 из ObjectParamersChangeListener’а 
© 2014 NetCracker Technology Corporation Confidential 53
Циклы наше всё 
В этом же hotspot view видно на каком уровне появляется цикл 
Видно, что проблема в количестве вызовов getMetricBundle 
© 2014 NetCracker Technology Corporation Confidential 54
Отчёты для PM 
Дерево java методов это круто, но в конце концов нужно 
разделять по видимым клиенту результатам 
Примеры: 
• Шапка – 1 сек, основная таблица – 2 сек, copyright – 1 сек 
• Проблема А – 2сек, проблема Б – 1 сек, остальное – 1 сек 
• Debug логи – 4 сек, всё остальное – 0 сек 
© 2014 NetCracker Technology Corporation Confidential 55
Отчёты для PM 
Если сделать логическую разбивку, то сразу понятно что стоит исправлять 
сразу, а что может подождать: 
© 2014 NetCracker Technology Corporation Confidential 56
«Известные проблемы» 
• В одном дереве часто встречается несколько проблем сразу 
• В каждой ветке top 1 проблема светится больше всего 
• Выход – берём и немного правим уже собранные данные 
© 2014 NetCracker Technology Corporation Confidential 57
Что делать с Map.get? 
Хочется смотреть и быстрые методы, а инструментировать 
слишком накладно 
• Попытка записать каждое обращение к .get обречена на 
провал 
• Если профайлер занимает 90% времени, то результат имеет 
небольшой смысл 
• Особенно для production 
© 2014 NetCracker Technology Corporation Confidential 58
Что делать с Map.get? 
Во многих случаях 10-100ms проблемы можно анализировать по 
простым thread dump’ам 
© 2014 NetCracker Technology Corporation Confidential 59
Открытые вопросы 
• Профилирование памяти 
• java 1.7u40: Java Mission Control 
• java 1.6u26: ThreadMXBean.getThreadAllocatedBytes 
• JITted/native code 
• Solaris Studio Performance Analyzer 
© 2014 NetCracker Technology Corporation Confidential 60
Выводы 
• Создать профайлер это просто 
• Сделать UI чуть сложнее 
• Профайлер без UI – время на ветер 
© 2014 NetCracker Technology Corporation Confidential 61
Вопросы? 
© 2014 NetCracker Technology Corporation Confidential 62
Список вызовов 
Список вызовов: http://server:port/profiler 
• Duration: длительность вызова 
• CPU time: время, потраченное на CPU java потоком 
• Suspension: длительность торможения сервера (gc, swap, …) 
• Calls: количество вызовов java методов в дереве 
• Transactions: количество транзакций с участием JDBC 
• Title: описание вызова: его тип и основные признаки 
• Disk IO: количество записанных/прочитанных с диска данных 
• Network IO: количество принятых/переданных по сети данных 
© 2014 NetCracker Technology Corporation Confidential 63

Weitere ähnliche Inhalte

Was ist angesagt?

Производительность open source решений
Производительность open source решенийПроизводительность open source решений
Производительность open source решенийVladimir Sitnikov
 
Deployment to production with an unexpected load
Deployment to production with an unexpected loadDeployment to production with an unexpected load
Deployment to production with an unexpected loadGrid Dynamics
 
Kubernetes
KubernetesKubernetes
KubernetesSQALab
 
Быстрое построение backendов c помощью реактивных потоков
Быстрое построение backendов c помощью реактивных потоковБыстрое построение backendов c помощью реактивных потоков
Быстрое построение backendов c помощью реактивных потоковCodeFest
 
Ядро автоматизации под микро-сервисную архитектуру
Ядро автоматизации под микро-сервисную архитектуруЯдро автоматизации под микро-сервисную архитектуру
Ядро автоматизации под микро-сервисную архитектуруSQALab
 
Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...
Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...
Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...Fwdays
 
Всевидящее око. Мониторинг нагрузочного тестирования с InfluxDB и Grafana
Всевидящее око. Мониторинг нагрузочного тестирования с InfluxDB и GrafanaВсевидящее око. Мониторинг нагрузочного тестирования с InfluxDB и Grafana
Всевидящее око. Мониторинг нагрузочного тестирования с InfluxDB и GrafanaSQALab
 
Joker 2015. WILD microSERVICES
Joker 2015. WILD microSERVICESJoker 2015. WILD microSERVICES
Joker 2015. WILD microSERVICESAleksandr Tarasov
 
Никита Галкин "Ловушки микросервисной архитектуры"
Никита Галкин "Ловушки микросервисной архитектуры"Никита Галкин "Ловушки микросервисной архитектуры"
Никита Галкин "Ловушки микросервисной архитектуры"Fwdays
 
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETЧто нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETDev2Dev
 
Организация процесса регулярной обработки больших объемов данных
Организация процесса регулярной обработки больших объемов данныхОрганизация процесса регулярной обработки больших объемов данных
Организация процесса регулярной обработки больших объемов данныхCodeFest
 
Zabbix 3.4 - простая непростая дружба с сообществом / Алексей Владышев (Zabbix)
Zabbix 3.4 - простая непростая дружба с сообществом / Алексей Владышев (Zabbix)Zabbix 3.4 - простая непростая дружба с сообществом / Алексей Владышев (Zabbix)
Zabbix 3.4 - простая непростая дружба с сообществом / Алексей Владышев (Zabbix)Ontico
 
Threads & LinkedClone. Как сократить время на развертывание продукта и подгот...
Threads & LinkedClone. Как сократить время на развертывание продукта и подгот...Threads & LinkedClone. Как сократить время на развертывание продукта и подгот...
Threads & LinkedClone. Как сократить время на развертывание продукта и подгот...SQALab
 
Реактивный двигатель вашего Android приложения
Реактивный двигатель вашего Android приложенияРеактивный двигатель вашего Android приложения
Реактивный двигатель вашего Android приложенияMatvey Malkov
 
Как перестать хранить секреты в git и начать использовать Hashicorp Vault
Как перестать хранить секреты в git и начать использовать Hashicorp VaultКак перестать хранить секреты в git и начать использовать Hashicorp Vault
Как перестать хранить секреты в git и начать использовать Hashicorp VaultOleg Mykolaichenko
 
Selenium grid on-demand
Selenium grid on-demandSelenium grid on-demand
Selenium grid on-demandSQALab
 
Алексей Романчук «Реактивное программирование»
Алексей Романчук «Реактивное программирование»Алексей Романчук «Реактивное программирование»
Алексей Романчук «Реактивное программирование»DevDay
 
Zabbix 3.2 - мониторинг качественно нового уровня / Алексей Владышев (Zabbix)
Zabbix 3.2 - мониторинг качественно нового уровня / Алексей Владышев (Zabbix)Zabbix 3.2 - мониторинг качественно нового уровня / Алексей Владышев (Zabbix)
Zabbix 3.2 - мониторинг качественно нового уровня / Алексей Владышев (Zabbix)Ontico
 
Continuous Delivery with Jenkins: Lessons Learned
Continuous Delivery with Jenkins: Lessons LearnedContinuous Delivery with Jenkins: Lessons Learned
Continuous Delivery with Jenkins: Lessons LearnedAleksandr Tarasov
 

Was ist angesagt? (20)

Производительность open source решений
Производительность open source решенийПроизводительность open source решений
Производительность open source решений
 
Deployment to production with an unexpected load
Deployment to production with an unexpected loadDeployment to production with an unexpected load
Deployment to production with an unexpected load
 
Kubernetes
KubernetesKubernetes
Kubernetes
 
Быстрое построение backendов c помощью реактивных потоков
Быстрое построение backendов c помощью реактивных потоковБыстрое построение backendов c помощью реактивных потоков
Быстрое построение backendов c помощью реактивных потоков
 
Ядро автоматизации под микро-сервисную архитектуру
Ядро автоматизации под микро-сервисную архитектуруЯдро автоматизации под микро-сервисную архитектуру
Ядро автоматизации под микро-сервисную архитектуру
 
Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...
Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...
Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...
 
Всевидящее око. Мониторинг нагрузочного тестирования с InfluxDB и Grafana
Всевидящее око. Мониторинг нагрузочного тестирования с InfluxDB и GrafanaВсевидящее око. Мониторинг нагрузочного тестирования с InfluxDB и Grafana
Всевидящее око. Мониторинг нагрузочного тестирования с InfluxDB и Grafana
 
Joker 2015. WILD microSERVICES
Joker 2015. WILD microSERVICESJoker 2015. WILD microSERVICES
Joker 2015. WILD microSERVICES
 
Никита Галкин "Ловушки микросервисной архитектуры"
Никита Галкин "Ловушки микросервисной архитектуры"Никита Галкин "Ловушки микросервисной архитектуры"
Никита Галкин "Ловушки микросервисной архитектуры"
 
10M tests per day
10M tests per day10M tests per day
10M tests per day
 
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETЧто нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
 
Организация процесса регулярной обработки больших объемов данных
Организация процесса регулярной обработки больших объемов данныхОрганизация процесса регулярной обработки больших объемов данных
Организация процесса регулярной обработки больших объемов данных
 
Zabbix 3.4 - простая непростая дружба с сообществом / Алексей Владышев (Zabbix)
Zabbix 3.4 - простая непростая дружба с сообществом / Алексей Владышев (Zabbix)Zabbix 3.4 - простая непростая дружба с сообществом / Алексей Владышев (Zabbix)
Zabbix 3.4 - простая непростая дружба с сообществом / Алексей Владышев (Zabbix)
 
Threads & LinkedClone. Как сократить время на развертывание продукта и подгот...
Threads & LinkedClone. Как сократить время на развертывание продукта и подгот...Threads & LinkedClone. Как сократить время на развертывание продукта и подгот...
Threads & LinkedClone. Как сократить время на развертывание продукта и подгот...
 
Реактивный двигатель вашего Android приложения
Реактивный двигатель вашего Android приложенияРеактивный двигатель вашего Android приложения
Реактивный двигатель вашего Android приложения
 
Как перестать хранить секреты в git и начать использовать Hashicorp Vault
Как перестать хранить секреты в git и начать использовать Hashicorp VaultКак перестать хранить секреты в git и начать использовать Hashicorp Vault
Как перестать хранить секреты в git и начать использовать Hashicorp Vault
 
Selenium grid on-demand
Selenium grid on-demandSelenium grid on-demand
Selenium grid on-demand
 
Алексей Романчук «Реактивное программирование»
Алексей Романчук «Реактивное программирование»Алексей Романчук «Реактивное программирование»
Алексей Романчук «Реактивное программирование»
 
Zabbix 3.2 - мониторинг качественно нового уровня / Алексей Владышев (Zabbix)
Zabbix 3.2 - мониторинг качественно нового уровня / Алексей Владышев (Zabbix)Zabbix 3.2 - мониторинг качественно нового уровня / Алексей Владышев (Zabbix)
Zabbix 3.2 - мониторинг качественно нового уровня / Алексей Владышев (Zabbix)
 
Continuous Delivery with Jenkins: Lessons Learned
Continuous Delivery with Jenkins: Lessons LearnedContinuous Delivery with Jenkins: Lessons Learned
Continuous Delivery with Jenkins: Lessons Learned
 

Ähnlich wie Do it yourself profiler

101 способ провести нагрузочное тестирование неправильно
101 способ провести нагрузочное тестирование неправильно101 способ провести нагрузочное тестирование неправильно
101 способ провести нагрузочное тестирование неправильноSQALab
 
Dev & test на windows azure
Dev & test на windows azureDev & test на windows azure
Dev & test на windows azureMicrosoft
 
Программируемость ACI. Примеры применения.
Программируемость ACI. Примеры применения.Программируемость ACI. Примеры применения.
Программируемость ACI. Примеры применения.Cisco Russia
 
Готовим Docker для Автоматизации Тестирования
Готовим Docker для Автоматизации ТестированияГотовим Docker для Автоматизации Тестирования
Готовим Docker для Автоматизации ТестированияCOMAQA.BY
 
Миграция JIRA - безобразие или безрассудство
Миграция JIRA - безобразие или безрассудствоМиграция JIRA - безобразие или безрассудство
Миграция JIRA - безобразие или безрассудствоSQALab
 
Полезное покрытие кода
Полезное покрытие кодаПолезное покрытие кода
Полезное покрытие кодаSQALab
 
Кирилл Комлев. О реализации continuous integration для web проектов
Кирилл Комлев. О реализации continuous integration для web проектовКирилл Комлев. О реализации continuous integration для web проектов
Кирилл Комлев. О реализации continuous integration для web проектовOlesya_V
 
Внедрение сетевой фабрики Cisco ACI в ЦОД небольшой организации
Внедрение сетевой фабрики Cisco ACI в ЦОД небольшой организацииВнедрение сетевой фабрики Cisco ACI в ЦОД небольшой организации
Внедрение сетевой фабрики Cisco ACI в ЦОД небольшой организацииCisco Russia
 
Внедрение сетевой фабрики Cisco ACI в ЦОД небольшой организации
Внедрение сетевой фабрики Cisco ACI в ЦОД небольшой организацииВнедрение сетевой фабрики Cisco ACI в ЦОД небольшой организации
Внедрение сетевой фабрики Cisco ACI в ЦОД небольшой организацииCisco Russia
 
Автономные Сети: упрощение развертывания уровня доступа в сети сервис-провайдера
Автономные Сети: упрощение развертывания уровня доступа в сети сервис-провайдераАвтономные Сети: упрощение развертывания уровня доступа в сети сервис-провайдера
Автономные Сети: упрощение развертывания уровня доступа в сети сервис-провайдераCisco Russia
 
Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"Yandex
 
Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»Yandex
 
D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"Dev2Dev
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорьdrupalconf
 
WebdriverIO + Puppeteer. Double gun – double fun
WebdriverIO + Puppeteer. Double gun – double funWebdriverIO + Puppeteer. Double gun – double fun
WebdriverIO + Puppeteer. Double gun – double funAlexandr Khotemskoy
 
И снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоИ снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоStanfy
 
IT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаIT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаMikhail Chinkov
 
Рэки IBM для проекта ExoGENI
Рэки IBM для проекта ExoGENIРэки IBM для проекта ExoGENI
Рэки IBM для проекта ExoGENIARCCN
 
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012Dmytro Mindra
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов ИгорьPVasili
 

Ähnlich wie Do it yourself profiler (20)

101 способ провести нагрузочное тестирование неправильно
101 способ провести нагрузочное тестирование неправильно101 способ провести нагрузочное тестирование неправильно
101 способ провести нагрузочное тестирование неправильно
 
Dev & test на windows azure
Dev & test на windows azureDev & test на windows azure
Dev & test на windows azure
 
Программируемость ACI. Примеры применения.
Программируемость ACI. Примеры применения.Программируемость ACI. Примеры применения.
Программируемость ACI. Примеры применения.
 
Готовим Docker для Автоматизации Тестирования
Готовим Docker для Автоматизации ТестированияГотовим Docker для Автоматизации Тестирования
Готовим Docker для Автоматизации Тестирования
 
Миграция JIRA - безобразие или безрассудство
Миграция JIRA - безобразие или безрассудствоМиграция JIRA - безобразие или безрассудство
Миграция JIRA - безобразие или безрассудство
 
Полезное покрытие кода
Полезное покрытие кодаПолезное покрытие кода
Полезное покрытие кода
 
Кирилл Комлев. О реализации continuous integration для web проектов
Кирилл Комлев. О реализации continuous integration для web проектовКирилл Комлев. О реализации continuous integration для web проектов
Кирилл Комлев. О реализации continuous integration для web проектов
 
Внедрение сетевой фабрики Cisco ACI в ЦОД небольшой организации
Внедрение сетевой фабрики Cisco ACI в ЦОД небольшой организацииВнедрение сетевой фабрики Cisco ACI в ЦОД небольшой организации
Внедрение сетевой фабрики Cisco ACI в ЦОД небольшой организации
 
Внедрение сетевой фабрики Cisco ACI в ЦОД небольшой организации
Внедрение сетевой фабрики Cisco ACI в ЦОД небольшой организацииВнедрение сетевой фабрики Cisco ACI в ЦОД небольшой организации
Внедрение сетевой фабрики Cisco ACI в ЦОД небольшой организации
 
Автономные Сети: упрощение развертывания уровня доступа в сети сервис-провайдера
Автономные Сети: упрощение развертывания уровня доступа в сети сервис-провайдераАвтономные Сети: упрощение развертывания уровня доступа в сети сервис-провайдера
Автономные Сети: упрощение развертывания уровня доступа в сети сервис-провайдера
 
Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"
 
Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»
 
D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
WebdriverIO + Puppeteer. Double gun – double fun
WebdriverIO + Puppeteer. Double gun – double funWebdriverIO + Puppeteer. Double gun – double fun
WebdriverIO + Puppeteer. Double gun – double fun
 
И снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоИ снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел Тайкало
 
IT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаIT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчика
 
Рэки IBM для проекта ExoGENI
Рэки IBM для проекта ExoGENIРэки IBM для проекта ExoGENI
Рэки IBM для проекта ExoGENI
 
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 

Do it yourself profiler

  • 1. Профайлер в каждый дом © 2014 NetCracker Technology Corporation Confidential Владимир Ситников
  • 2. © 2014 NetCracker Technology Corporation Confidential 2 Кто я? Владимир Ситников System Performance @ NetCracker sitnikov@netcracker.com @VladimirSitnikv
  • 3. © 2014 NetCracker Technology Corporation Confidential 3 План • Зачем нужны профайлеры • Зачем создавать свой профайлер, если есть готовое? • Выбираем подход • Sampling vs instrumentation • Пишем • Визуализация и анализ результатов
  • 4. Типичный цикл разработки Разработка Production © 2014 NetCracker Technology Corporation Confidential 4
  • 5. Типичный цикл разработки Разработка Production Postmortem optimization is root of all evil © 2014 NetCracker Technology Corporation Confidential 5
  • 6. Критерии оптимизации Мы будем обсуждать операции по 0.05..5+ сек © 2014 NetCracker Technology Corporation Confidential 6
  • 7. Зачем жениться профилировать? • Надо, чтобы работало гораздо быстрее • Сделано должно быть ещё вчера • Ты попал даже если там всего 1 твоя строка кода © 2014 NetCracker Technology Corporation Confidential 7
  • 8. Что ждём от профайлера? • Нужно знать какие методы тормозили • MyDAO.loadObject • SocketOutputStream.write • Нужно знать какие модули тормозили • Шапка, таблица с результатами © 2014 NetCracker Technology Corporation Confidential 8
  • 9. Что нужно получать помимо длительности? • Нужно знать что и когда происходило • Имя нажатой кнопки, URL • Нужно знать контекст • customer ID / order ID / user ID, SQL запросы, параметры к ним и так далее • Нужно уметь заглядывать в прошлое • «У нас вчера было лучше/хуже» © 2014 NetCracker Technology Corporation Confidential 9
  • 10. Так ведь есть же профайлеры? • Нужно чтобы профайлер был на каждом сервере • DEV/QA/PROD • Профайлер может потребоваться каждому разработчику • Тут и на лицензиях разориться недолго • Профайлер должен понимать суть профилируемого • Иначе получим «всё время потрачено в HashMap.get» © 2014 NetCracker Technology Corporation Confidential 10
  • 11. Интеграция профайлера и профилируемого кода Код должен быть написан с оглядкой на профайлер class UserServlet { private String userName; void doPost() { String userId = ...; Как значения userName и userId попадут в результаты? © 2014 NetCracker Technology Corporation Confidential 11
  • 12. Интеграция профайлера и профилируемого кода • Нельзя просто взять и поправить старые версии кода • А профилировать всё равно нужно • Пока не получишь результат, непонятно где и какие значения нужно захватывать • Цикл «поправили->собрали->выдали» играет против нас © 2014 NetCracker Technology Corporation Confidential 12
  • 13. Интеграция профилируемого кода и профайлера • Передаём из JMeter специальный HTTP header • Ловим его в профайлере • Анализ результатов нагрузочного теста сильно упрощается © 2014 NetCracker Technology Corporation Confidential 13
  • 14. Есть профайлеры в java мире! © 2014 NetCracker Technology Corporation Confidential 14
  • 15. Измеряем время ответа на клиенте • 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 © 2014 NetCracker Technology Corporation Confidential 15
  • 16. Измеряем время ответа из самого приложения Немного perf4j.log и у нас лог с замерами StopWatch watch = new LoggingStopWatch("login"); runnable.run(); watch.stop(); // how much watch? В логе будет как-то так: start[1415926535898] time[42] tag[login] © 2014 NetCracker Technology Corporation Confidential 16
  • 17. Измеряем время ответа стохастически Sampling: poor man's profiler watch -n 0.1 kill -3 pid • Каждые 0.1сек снимаем thread dump • И смотрим чем чаще всего занимаются потоки © 2014 NetCracker Technology Corporation Confidential 17
  • 18. Измеряем время ответа стохастически Смотрим ворох 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 © 2014 NetCracker Technology Corporation Confidential 18
  • 19. Safepoint • Нельзя просто остановить поток в произвольном месте • Чтобы узнать stacktrace нужно-таки остановить • В вершине стека может оказаться случайный метод • Тем не менее, снимать thread dump’ы с production раз в 5 минут весьма полезно © 2014 NetCracker Technology Corporation Confidential 19
  • 20. Измеряем время ответа на короткой ноге с JVM honest-profiler • Решает проблему safepoint bias • Использует недокументированное API: AsyncGetCallTrace • Пока не готово к production  © 2014 NetCracker Technology Corporation Confidential 20
  • 21. Может, купить какой-нибудь профайлер? Клиент не всегда согласен устанавливать сторонние инструменты • Прошлый отрицательный опыт • Цена вопроса • Чрезмерная общность • Сложная адаптация кода к внешнему профайлеру © 2014 NetCracker Technology Corporation Confidential 21
  • 22. А что если создать профайлер для себя? © 2014 NetCracker Technology Corporation Confidential 22
  • 23. Создать профайлер совсем несложно • Java byte code един для всех платформ • Добавляем methodEnter/methodExit в нужные методы и дело в шляпе! • Instrumentation подход очень хорош для 10мс+ методов © 2014 NetCracker Technology Corporation Confidential 23
  • 24. MethodEnter/methodExit Варианты добавить профилирующие вызовы: • Вручную править исходный код • Javassist • Aspect oriented programming • ASM Objectweb + Instrumentation API © 2014 NetCracker Technology Corporation Confidential 24
  • 25. Пишем профайлер за 4 шага © 2014 NetCracker Technology Corporation Confidential 25
  • 26. Шаг 1 – пишем логгер данных Пишем логгер class Profiler { public static State methodEnter(int id); } interface State { public void methodExit(); public void logArg(int id, String value); © 2014 NetCracker Technology Corporation Confidential 26 }
  • 27. Шаг 1 – что нужно от profiler logger? • Хорошая скорость потоковой записи • Компактность данных • По возможности, random-access • Возможность экспорта данных за нужный интервал времени © 2014 NetCracker Technology Corporation Confidential 27
  • 28. Шаг 1 – где взять логгер? • Взять готовый • Chronicle-Queue / Chronicle • Создать самим • DataOutputStream(new GZIPOutputStream(…)) © 2014 NetCracker Technology Corporation Confidential 28
  • 29. Шаг 2 – добавляем вызовы логгера в код Нужно примерно следующее: class MyDAO extends NoSQL { Object loadObject() { State s = Profiler.methodEnter(42); try { // прежний код метода loadObject } finally { s.methodExit(); ... © 2014 NetCracker Technology Corporation Confidential 29
  • 30. Шаг 2 – добавляем вызовы логгера в код Байткод совсем не страшен: ASM и вперёд class ProfilingAdapter extends AdviceAdapter { protected void onMethodEnter() { добавляем вызов Profiler.methodEnter(); © 2014 NetCracker Technology Corporation Confidential 30 } }
  • 31. Шаг 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 © 2014 NetCracker Technology Corporation Confidential 31
  • 32. Шаг 4 – Пишем UI для просмотра данных Web приложение для просмотра данных очень удобно: • Не требуется ставить клиент • Без проблем работает отдельно от самого приложения • Немного вспоминается «как рисовать сову», но SlickGrid и jQuery творят чудеса © 2014 NetCracker Technology Corporation Confidential 32
  • 33. Подводные камни © 2014 NetCracker Technology Corporation Confidential 33
  • 34. Подводные камни •Web browser • Contention / Concurrency • JVM • OS / Hardware © 2014 NetCracker Technology Corporation Confidential 34
  • 35. Подводные камни - Browser JavaScript работает весьма быстро, но • Выделить более 1Гб данных в javascript сложно • Нужно представлять данные компактно (ваш Кэп) • Глубина иерархии массивов ограничена ([1,2,[3,4],…]) • Нужно разбивать сильно вложенные структуры • Более 100 уровней на экран просто не поместится • Нужно показывать только важные ветви дерева © 2014 NetCracker Technology Corporation Confidential 35
  • 36. Подводные камни - Contention Profiler вызывается из разных потоков (surprise!), а значит: • Нужно следить за synchronized/volatile • ArrayBlockingQueue (ABQ) вполне хорошо • Стоит накопить пачку данных и уже её засылать в ABQ • Не забываем про Single Writer Principle и писателю логов живётся хорошо © 2014 NetCracker Technology Corporation Confidential 36
  • 37. Подводные камни – 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 © 2014 NetCracker Technology Corporation Confidential 37
  • 38. Подводные камни – OS / Hardware Не пытайтесь покинуть Омск © 2014 NetCracker Technology Corporation Confidential 38
  • 39. Подводные камни – OS / Hardware Не пытайтесь использовать System.nanoTime и currentTimeMillis • Эти методы очень плохо работают под нагрузкой: точность/скорость проседает в 1000 раз • Nanotrusting Nanotime: © 2014 NetCracker Technology Corporation Confidential 39
  • 40. Есть ли жизнь без currentTimeMillis? Запускаем поток, и пусть он следит за временем: class IAmTimer extends Thread { public static volatile long now; public run() { while(true) { now = System.currentTimeMillis(); sleep(1); // На Solaris спит по 10+мс © 2014 NetCracker Technology Corporation Confidential 40
  • 41. Есть ли жизнь без currentTimeMillis? • Если sleep(1) длится гораздо больше 1мс, то мы что-то подозреваем: GC пауза, Swap-in, safepoint, гранулярность таймера • Такие события полезно записывать и отображать • jHiccup работает как раз таким образом © 2014 NetCracker Technology Corporation Confidential 41
  • 42. Складываем вместе и смотрим © 2014 NetCracker Technology Corporation Confidential 42
  • 43. Что получилось у нас • Мы используем профайлер в production • Менее 1% увеличение времён отклика • 500MiB gzip логов в час с одного узла (4-8 CPU core) • Одного log writer’а на JVM пока хватает • Профайлер активно используется разработчиками © 2014 NetCracker Technology Corporation Confidential 43
  • 44. Perf4j + ggplot С помощью ggplot можно построить хорошие диаграммы из простых perf4j / access.log данных ggplot(logs) + geom_segment(aes(x=start, xend=end), size=2) © 2014 NetCracker Technology Corporation Confidential 44
  • 45. Свой профайлер всегда доступен Заходим на /profiler и видим было ли приложению «плохо» © 2014 NetCracker Technology Corporation Confidential 45
  • 46. Поиск вызова Поиск нужного вызова: • По диапазону дат, длительности • По подстроке © 2014 NetCracker Technology Corporation Confidential 46
  • 47. Разные страницы – разные деревья вызовов При instrumentation подходе можно рассмотреть каждое дерево независимо © 2014 NetCracker Technology Corporation Confidential 47
  • 48. Дерево вызовов курильщика В «обычном» профайлере у дерева нет конца и края: В случае JBoss AS доходило до 1’400 глубины стека  © 2014 NetCracker Technology Corporation Confidential 48
  • 49. Дерево вызовов здорового человека Мы скрываем незначимые уровни и всё помещается на экран-два-три: © 2014 NetCracker Technology Corporation Confidential 49
  • 50. Легко найти свой код Каждый разработчик может в 1 click найти свой код Видно: • Общее количество вызовов getRoles • Каждый getRoles всегда вызывает findBySQL • Из 5-и секунд getRoles 2.9 сек тратилось на ejbStore © 2014 NetCracker Technology Corporation Confidential 50
  • 51. Черновик экрана hotspots Первая версия окна hotspots: просто время, проведённое в методе © 2014 NetCracker Technology Corporation Confidential 51
  • 52. Hotspots v2 Попробовали и поняли, что нужно показывать источник вызовов © 2014 NetCracker Technology Corporation Confidential 52
  • 53. Поиск источника вызовов Немного развернём и уже понятна причина Видно: • Из ProjectTrackingListener’а было 1473+731 вызов getRoles • Ещё 5 из ObjectParamersChangeListener’а © 2014 NetCracker Technology Corporation Confidential 53
  • 54. Циклы наше всё В этом же hotspot view видно на каком уровне появляется цикл Видно, что проблема в количестве вызовов getMetricBundle © 2014 NetCracker Technology Corporation Confidential 54
  • 55. Отчёты для PM Дерево java методов это круто, но в конце концов нужно разделять по видимым клиенту результатам Примеры: • Шапка – 1 сек, основная таблица – 2 сек, copyright – 1 сек • Проблема А – 2сек, проблема Б – 1 сек, остальное – 1 сек • Debug логи – 4 сек, всё остальное – 0 сек © 2014 NetCracker Technology Corporation Confidential 55
  • 56. Отчёты для PM Если сделать логическую разбивку, то сразу понятно что стоит исправлять сразу, а что может подождать: © 2014 NetCracker Technology Corporation Confidential 56
  • 57. «Известные проблемы» • В одном дереве часто встречается несколько проблем сразу • В каждой ветке top 1 проблема светится больше всего • Выход – берём и немного правим уже собранные данные © 2014 NetCracker Technology Corporation Confidential 57
  • 58. Что делать с Map.get? Хочется смотреть и быстрые методы, а инструментировать слишком накладно • Попытка записать каждое обращение к .get обречена на провал • Если профайлер занимает 90% времени, то результат имеет небольшой смысл • Особенно для production © 2014 NetCracker Technology Corporation Confidential 58
  • 59. Что делать с Map.get? Во многих случаях 10-100ms проблемы можно анализировать по простым thread dump’ам © 2014 NetCracker Technology Corporation Confidential 59
  • 60. Открытые вопросы • Профилирование памяти • java 1.7u40: Java Mission Control • java 1.6u26: ThreadMXBean.getThreadAllocatedBytes • JITted/native code • Solaris Studio Performance Analyzer © 2014 NetCracker Technology Corporation Confidential 60
  • 61. Выводы • Создать профайлер это просто • Сделать UI чуть сложнее • Профайлер без UI – время на ветер © 2014 NetCracker Technology Corporation Confidential 61
  • 62. Вопросы? © 2014 NetCracker Technology Corporation Confidential 62
  • 63. Список вызовов Список вызовов: http://server:port/profiler • Duration: длительность вызова • CPU time: время, потраченное на CPU java потоком • Suspension: длительность торможения сервера (gc, swap, …) • Calls: количество вызовов java методов в дереве • Transactions: количество транзакций с участием JDBC • Title: описание вызова: его тип и основные признаки • Disk IO: количество записанных/прочитанных с диска данных • Network IO: количество принятых/переданных по сети данных © 2014 NetCracker Technology Corporation Confidential 63