Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CodeFest 2019. Михаил Ярийчук (Hibernating Rhin...

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

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

CodeFest

April 06, 2019
Tweet

More Decks by CodeFest

Other Decks in Programming

Transcript

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

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

    летним опытом ! В последние 6 лет разработчик СУБД RavenDB ! Работаю над GraphAPI для RavenDB
  3. Мысленный эксперимент ! Серверное приложение в продакшне ! Запросы на

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

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

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

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

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

    Livelock ! Infinite loop ! Слишком частые циклы GC
  9. High CPU 
 Слишком частые циклы GC ! Managed Memory

    – граф обьектов ! Сканирование графов - дорого! ! Поколения
  10. Тип проблемы - Проблемы с Managed Memory Почему? ! Reference

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

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

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

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

    символов (.Net, WinAPI) ! Символы для своего кода, SymSrv (PDBs) ! Memory dump (конечно!) https://docs.microsoft.com/en-us/windows/desktop/debug/symbol-servers-and-symbol-stores
  15. Oткуда взять memory dump? ! Task Manager, Sysinternals Process Explorer

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

    Full-dump ! Информация о Threads ! Запись памяти процесса ! Большая величина ! Security risk - данные клиентов
  17. Немного о Full dump ! Утечки памяти ! Fragmentation !

    Проблемы с Finalizers ! Fatal Exceptions (AccessViolation, StackOverflow...) ! High CPU ! Паузы в исполнении
  18. 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/