CodeFest 2019. Михаил Ярийчук (Hibernating Rhinos) — Как делать анализ .Net memory dumps в WinDBG, и зачем это нужно

CodeFest 2019. Михаил Ярийчук (Hibernating Rhinos) — Как делать анализ .Net memory dumps в WinDBG, и зачем это нужно

Проект запущен в продакшн, сервера работают хорошо и эффективно. Проходит две недели и вдруг... сервер зависает при 100% утилизации CPU, памяти или того и другого. Или просто зависает. Что делать? Дебажить в продакшне нехорошо, а зачастую невозможно. Перезагрузить сервер? Вполне возможно поможет, но это временное решение. В большинстве подобных случаев, анализ «слепка памяти» и состояния процесса в дебаггере WinDBG поможет добратся то сути проблемы. В этом докладе я расскажу что за зверь такой эти «слепки памяти» или memory dumps, покажу демо основных способов анализа и обьясню когда стоит а когда не стоит использовать этот сложный, но весьма полезный вид дебаггинга.

16b6c87229eaf58768d25ed7b2bbbf52?s=128

CodeFest

April 06, 2019
Tweet

Transcript

  1. Как делать анализ .Net memory dumps в WinDBG, и зачем

    это нужно Михаил Ярийчук Hibernating Rhinos
  2. Немного обо мне Михаил Ярийчук ! Программист .Net с 11

    летним опытом ! В последние 6 лет разработчик СУБД RavenDB ! Работаю над GraphAPI для RavenDB
  3. None
  4. Зачем? (и почему!)

  5. Мысленный эксперимент ! Серверное приложение в продакшне ! Запросы на

    сервер возвращают Timeout... Серверное приложение
  6. Мысленный эксперимент Что делать? 1. Ребут (рестарт?) 2. Читать код/искать

    баг 3. Добавить логи 4. Дебажить в продакшн 5. Взять memory dump для анализа
  7. Пятый вариант: 
 Post-mortem analysis Диагностика проблем в продакшне !

    Зависание процесса ! Resource saturation (resource starvation, high cpu, high memory) ! Падение процесса* (crash)
  8. Post-mortem analysis в WinDBG ! Нет единого алгоритма ! Работа

    с WinDBG = раследование ! Опыт + "Google-Fu" https://www.backupassist.com/blog/news/improving-your-google-fu-how-to-find-anything- you-want/
  9. С чего начнем анализ? ! Симптомы тип проблемы ! Тип

    проблемы стратегия расследования
  10. Тип проблемы - High CPU Почему? ! Неэффективный код !

    Livelock ! Infinite loop ! Слишком частые циклы GC
  11. High CPU - Livelock Муж [голодный] Жена [голодная] Еда

  12. High CPU - Livelock Муж [голодный] Жена [голодная] Еда Дорогая,

    ты голодная? Да!
  13. High CPU - Livelock Муж [голодный] Жена [голодная] Еда Дорогой,

    ты голодный ? Да!
  14. High CPU - Livelock Муж [голодный] Жена [голодная] Еда Дорогая,

    ты голодная? Да!
  15. High CPU 
 Слишком частые циклы GC ! Managed Memory

    – граф обьектов ! Сканирование графов - дорого! ! Поколения
  16. GC and references (.Net, Java, Go...) https://en.wikipedia.org/wiki/Tracing_garbage_collection

  17. Тип проблемы - Проблемы с Managed Memory Почему? ! Reference

    "leak" ! Fragmentation/LOH ! Недостаточно быстрый GC - convoy ! Unmanaged resources leak ! Слишком длинный Finalization Queue (производительность?) ! Исключения в Finalizers ! Deadlock в Finalizers
  18. Managed Memory - Unmanaged resources leak Free unmanaged resource

  19. Managed Memory - Unmanaged resources leak .Net Code C# Sql

    Driver Unmanaged Sql Connection Not GC'ed!
  20. Тип проблемы - 
 Падение процесса (crash) ! Unhandled exceptions

    ! AccessViolationException ! StackoverflowException ! OutOfMemoryException
  21. Тип проблемы - 
 Зависание (hang) ! Deadlock ! Livelock

    ! Infinite loop ! Thread starvation
  22. Что за зверь такой, “WinDBG”?

  23. Что это за зверь такой, "WinDBG"? ! Работает только в

    Windows ! В Linux-е есть GDB, LLDB (SOS commands) ! Многофункциональный дебаггер для ОС и приложений ! Анализ Post-mortem ! Дебаггинг .Net и Native ! Олд скул!
  24. Начало работы с WinDBG ! X86 / x64 ! Сервер

    символов (.Net, WinAPI) ! Символы для своего кода, SymSrv (PDBs) ! Memory dump (конечно!) https://docs.microsoft.com/en-us/windows/desktop/debug/symbol-servers-and-symbol-stores
  25. Конфигурация символов в WinDBG c:\symbols cache*c:\symbols SRV*c:\symbols*http://msdl.microsoft.com/download/symbols сервер символов Microsoft

    "локальный" сервер символов
  26. А что насчет memory dumps? ! WinDBG - дебаггер !

    WinDBG - анализ memory dumps
  27. Memory dumps

  28. Oткуда взять memory dump? ! Task Manager, Sysinternals Process Explorer

    ! WinDBG ! ADPlus ! Win32 API ! Sysinternals Procdump
  29. Memory dump Mini-dump ! Информация о Threads ! Малая величина

    Full-dump ! Информация о Threads ! Запись памяти процесса ! Большая величина ! Security risk - данные клиентов
  30. Немного о Mini-dump ! Зависание процесса (deadlock, infinite loop, etc)

    ! High CPU
  31. Немного о Full dump ! Утечки памяти ! Fragmentation !

    Проблемы с Finalizers ! Fatal Exceptions (AccessViolation, StackOverflow...) ! High CPU ! Паузы в исполнении
  32. Ну хорошо, а если попрактичнее?

  33. WinDBG 101 Распостраненные команды

  34. Полезные комманды WinDBG .loadby sos coreclr .loadby sos clr .Net

    Core Framework Full .Net Framework
  35. !dumpheap –stat !dumpheap –type System.String Полезные комманды WinDBG

  36. Полезные комманды WinDBG !runaway

  37. Полезные комманды WinDBG !threads

  38. Полезные комманды WinDBG !gcroot [address]

  39. Полезные комманды WinDBG ~~[19dc]s !clrstack

  40. WinDBG Extensions .load [path to extensions]\[assembly name] Имя файла должно

    быть без расширения (extension) ! SOSEX - дополнительные комманды, анализ процессов .Net ! Tracer - Open/Close tracing https://github.com/goldshtn/windbg-extensions http://www.stevestechspot.com/
  41. Демо Демо

  42. Демо ✓ Deadlock ✓ Livelock ✓ Memory "Leak“ ✓ AccessViolationException

  43. Вопросы?
 michael.yarichuk@hibernatingrhinos.com
 Вопросы?
 michael.yarichuk@hibernatingrhinos.com
 https://github.com/ravendb https://github.com/myarichuk/ WinDBG.Issue.Investigation.Demo