Как получить дамп памяти сервера. И зачем. И что это вообще

Начнём с конца — что такое дамп памяти? Это сохранение содержимого памяти в файл. Своеобразный post mortem. Для последующего анализа.

Зачем

Нередкая ситуация: стоит сервер, работает, работает и вдруг бац, перезагрузился. И, вроде, дальше работает, но как-то некомфортно уже. А ну как ещё раз? Да неизвестно когда.

Или бывает, что регулярно. Точнее не регулярно, потому как нет стабильного интервала, но систематически, операционная система падает в BSOD. Ладно если началось после установки софта какого, а если железо — пойди угадай какое.

Но не только спонтанным падением ОС в синий экран ограничивается использование дампа. Иногда его вызывают вручную. По молодости для меня это даже звучало дико. Сейчас, работая в саппорте, я сталкиваюсь с ручным заваливанием ОС в целях получения дампа едва ли не чаще классического патологоанатомического анализа рухнувших систем. Дело в том, что анализ дампа, пожалуй, лучший способ найти причину жёстких проблем с производительностью, когда система вдруг перестаёт откликаться на любые внешние запросы. Или, например, групповые политики применяются уже 20 минут. Вскрыв дамп можем выяснить точного виновника торжества.

Есть определённая магия в исследовании дампов. Ведь дамп — снимок состояния системы на определённый момент, который уже давно прошёл. Исследование кусочка прошлого. Чувство палеонтолога, нашедшего комара в янтаре. Ну да ладно, хватит лирики.

Как

Кажется, всё просто: System — Advanced Settings — Startup and Recovery

dump_config

Но есть определённые нюансы. И так как часто приходится писать инструкции и различные пояснения, решил собрать в кучу всё, что накопилось. Стоит иметь общее представление.

Наиболее типичные варианты:

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

Создать новый параметр

Name : CrashOnCtrlScroll 
Data Type : REG_DWORD 
Value : 1 


crushonctrl

Любители нестандартных подходов могут выбрать любое другое сочетание, покурив статью 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.