Начнём с конца — что такое дамп памяти? Это сохранение содержимого памяти в файл. Своеобразный post mortem. Для последующего анализа.
Зачем
Нередкая ситуация: стоит сервер, работает, работает и вдруг бац, перезагрузился. И, вроде, дальше работает, но как-то некомфортно уже. А ну как ещё раз? Да неизвестно когда.
Или бывает, что регулярно. Точнее не регулярно, потому как нет стабильного интервала, но систематически, операционная система падает в BSOD. Ладно если началось после установки софта какого, а если железо — пойди угадай какое.
Но не только спонтанным падением ОС в синий экран ограничивается использование дампа. Иногда его вызывают вручную. По молодости для меня это даже звучало дико. Сейчас, работая в саппорте, я сталкиваюсь с ручным заваливанием ОС в целях получения дампа едва ли не чаще классического патологоанатомического анализа рухнувших систем. Дело в том, что анализ дампа, пожалуй, лучший способ найти причину жёстких проблем с производительностью, когда система вдруг перестаёт откликаться на любые внешние запросы. Или, например, групповые политики применяются уже 20 минут. Вскрыв дамп можем выяснить точного виновника торжества.
Есть определённая магия в исследовании дампов. Ведь дамп — снимок состояния системы на определённый момент, который уже давно прошёл. Исследование кусочка прошлого. Чувство палеонтолога, нашедшего комара в янтаре. Ну да ладно, хватит лирики.
Как
Кажется, всё просто: System — Advanced Settings — Startup and Recovery
Но есть определённые нюансы. И так как часто приходится писать инструкции и различные пояснения, решил собрать в кучу всё, что накопилось. Стоит иметь общее представление.
Наиболее типичные варианты:
Small memory dump — записывается минимум информации — можно будет понять общую причину сбоя. А она бывает настолько общей, что несколько полных дампов требуется, чтобы что-то конкретизировать.
Kernel memory dump — сохраняется только та часть памяти, в которой работали компоненты ядра (kernel). Размер этого дампа не превышает 8,5 ГБ для Windows 2008 R2 x64, для Windows 2012 R2 уже, в принципе, может разогнаться до 128 ГБ (но не больше, чем физической памяти в сервере), однако больше 8,5 ещё не попадались. Для большинства сбоев — драйверы, оборудование, системные процессы — его достаточно. Для анализа проблем производительности и сбоев, в которых задействовано не системное ПО (включая службы), как правило, нет.
Complete memory dump (или Full) — содержит всю память (и kernel mode и user mode), то есть максимально полную информацию о состоянии системы со всеми приложениями и состоянием этих приложений на момент сбоя. Но и самый прожорливый вариант, поскольку размер дампа будет равен объёму физической памяти сервера, а на текущий момент 256 ГБ RAM уже не есть что-то удивительное. Нам тут выгрузили полный дамп сервера размером 4 ТБ. Это было интересно.
В некоторых случаях применим лайфхак — перед созданием дампа можно извлечь из сервера несколько планок памяти, или, если он виртуальный, уменьшить размер выделенной RAM (или склонировать сервер и порезать уже новую копию).
Но мало просто выбрать тип дампа. Потому что дамп не сможет собраться если:
- файл подкачки недостаточного размера — должен быть чуть больше предполагаемого размера дампа, и не суммарно на нескольких дисках, а единым куском. Благо с Windows 2008R2 стало можно использовать pagefile не только на системном диске;
- у сервера включена функция ASR (Automatic Server Recovery), которая перезагружает сервер, если не получает отклика от ОС. В зависимости от производителя и модели сервера, может отключаться через BIOS и/или программно (HP Proliant System Shutdown Service);
- на диске не хватит места для создания дампа (по умолчанию папка %Windir%).
Как-то затратили больше недели, чтобы получить дамп сервера, который систематически падал в BSOD. Сначала мешала ASR, потом нехватка места на системном диске, а потом выяснилось, что кто-то, помимо 194 ГБ файла подкачки на специально выделенном дисковом томе создал ещё один размером 10 ГБ на системном. А при создании дампа ОС начинает искать с системного. И его не хватило.
Чтобы убедиться, что используется файл подкачки на нужном диске, стоит проверить ключ реестра HKLM\System\CurrentControlSet\Control\SessionManager\MemoryManagement
параметр PagingFiles должен первым значением иметь нужный том.
Как сгенерировать дамп вручную (инициировать BSOD)
1. Классический способ — с помощью клавиатуры.
Для ключа
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\kbdhid\Parameters
Создать новый параметр
1 2 3 4 |
Name : CrashOnCtrlScroll Data Type : REG_DWORD Value : 1 <a href="https://sys-admin.in.ua/wp-content/uploads/crushonctrl.png"><img class="aligncenter size-full wp-image-447" alt="crushonctrl" src="https://sys-admin.in.ua/wp-content/uploads/crushonctrl.png" width="802" height="251" /></a> |
Любители нестандартных подходов могут выбрать любое другое сочетание, покурив статью msdn Forcing a System Crash from the Keyboard. Вплоть до CTRL+C
2. NotMyFault
К сожалению, в современных виртуальных средах клавиатура — не всегда приемлемый способ. В большинстве случаев более удобно использовать утилиту NotMyFault.
Скачать можно тут https://live.sysinternals.com/Files/NotMyFault.zip
Всё что нужно сделать — запустить командную строку с административными привилегиями, ввести NotMyFault.exe /crash и нажать Enter.
Но и приложение в виртуальной среде запустить не всегда возможно. Бывает, что система не отвечает и даже не показывает ничего, кроме чёрного экрана. В этом случае нам поможет сама виртуальная среда.
Как получить дамп текущего состояния виртуальной машины
Если у вас VMware ESXi, следуем по ссылке Converting a snapshot file to memory dump using the vmss2core tool (2003941)
Если у вас Hyper-V, то Taking a dump of a VM running on Hyper-V
Что дальше?
А дальше WinDbg или кому что нравится и почувствуй себя патологоанатомом. К сожалению, я даже с парой внутренних модулей расширений для дебаггера от Microsoft, которые по мощи можно сопоставить с роботизированным лазерным скальпелем в сравнении с куском стекла в виде стандартного дебаггера, пока способен только к поверхностным вскрытиям. Так что не могу пока чем-то поделиться. Да и не мыслю уже работу без этих модулей. Тащите пациентов к нам в Premier Support.