Ошибка 333 появилась в системном журнале событий с выпуском Windows Server 2003 SP1 и быстро стала одной из наиболее частых причин обращения в службу технической поддержки Microsoft. В некоторых случаях на диагностику и устранение этой ошибки уходит несколько недель. В частности, приходится долго выяснять, к какой общей категории следует отнести данную ошибку. Ввиду непонятного описания диагностика занимает много времени. Ниже описано, как выяснить причину возникновения ошибки 333 для самостоятельного решения проблемы или получить информацию, которая повысит эффективность оказания технической поддержки.

Симптомы ошибки 333

Описание ошибки 333: «Неустранимый сбой операции ввода/вывода, запущенной реестром. Не удалось выполнить чтение, запись или запись буфера для одного из файлов, содержащих образ системного реестра». Это означает, что образ реестра, удерживаемый в памяти, не может быть записан на диск. Windows использует модуль отложенной записи для периодической записи измененных страниц памяти на диск. При отказе модуля отложенной записи в системном журнале событий регистрируется ошибка 333.

Симптомы, сопровождающие ошибку 333, включают:

  • «Зависание» сервера — сервер полностью перестает реагировать на нажатие клавиш и движения мыши и становится полностью недоступен, требуя «жесткой» перезагрузки.
  • Медленная работа сервера — сервер чрезвычайно медленно реагирует на действия и обработка информации значительно заторможена.
  • Замедленное подключение к службам терминалов — регистрация пользователей в сеансе при подключении к серверу терминалов осуществляется с задержкой. После регистрации в сеансе работа может идти, как обычно, но сама регистрация занимает несколько минут вместо нескольких секунд.
  • Ошибки 333 можно разбить на три категории:
  • Истощение ресурсов памяти. При попытке выполнения записи измененных страниц из кэша на диск модулем отложенной записи оказалось недостаточно ресурсов. Часто этот тип проблемы сопровождается событием 2020 или 2019.
  • Диск был занят или недоступен. Иногда занятый диск недостаточно быстро реагирует на запрос модуля отложенной записи на сохранение измененных страниц памяти.
  • «Раздувание» реестра. Реестр неожиданно увеличивается в размере, все более затрудняя сохранение изменений на диск, что обычно случается на терминальных серверах.

Особенно неприятно, что события продолжают регистрироваться в системном журнале (много раз в минуту) до перезагрузки сервера. Достаточно одного отказа модуля отложенной записи, чтобы события начали наводнять системный журнал. Хотя причина отказа модуля отложенной записи могла быть кратковременной (например, пик использования памяти), ошибки 333 продолжают регистрироваться в журнале даже при нормальном использовании памяти. Это происходит потому, что системе известно о неудачной попытке синхронизации реестра, а также о том, что версия реестра, содержащаяся в памяти, не соответствует версии на диске. Поэтому количество и частота ошибок 333 не являются достоверным индикатором остроты проблемы. По умолчанию модуль отложенной записи пытается записывать на диск изменения каждые пять секунд.

Средства диагностики ошибок 333

Диагностируя ошибку 333, сначала необходимо определить, к какой общей категории ее следует отнести. Полезно также проверить системный журнал на наличие других событий, сопровождающих ошибку 333,?— например, события 2020, указывающего на отсутствие памяти выгружаемого страничного пула, либо события 2019, свидетельствующего об утечке памяти невыгружаемого страничного пула.

В диагностике ошибки 333 могут помочь следующие инструменты.

  • Системный монитор. Отслеживаемые индикаторы — объекты системы, памяти, диска и процесса.
  • Объект памяти. Отслеживается рост невыгружаемой или выгружаемой памяти.
  • Объект процесса. Отслеживается непрерывный рост числа маркеров процесса непосредственно перед регистрацией ошибки 333.
  • Объект системы. Счетчик «процент использования квоты реестра» указывает на долю используемой разрешенной квоты реестра. Чем больше эта доля, тем вероятнее, что проблема связана с разрастанием реестра.
  • Физический диск. Отслеживается счетчик средней длины очереди ожидающих запросов к диску (Avg Disk Queue Length), указывающий на среднее число запросов чтения и записи. В случае всплеска показаний этого счетчика при возникновении проблемы следует проанализировать драйверы фильтра (т.?е. антивирусное программное обеспечение или программное обеспечение для резервного копирования) данной системы.
  • Poolmon.exe. Эта команда, включенная в инструменты отладки Windows, используется для проверки использования пула памяти ядра по тэгу распределения пула. Применение poolmon.exe может вдвое сократить время диагностики, поскольку позволяет отыскать тэг, допускающий утечку памяти.
  • Dureg.exe. Этот инструмент позволяет проследить размер каждой ветви реестра и выяснить, который из них занимает наибольшее пространство, чтобы определить, какая программа могла вызвать проблему.

Случай 1. Поиск драйвера, допускающего утечку памяти

Недавно я работал над проблемой полного зависания сервера Windows 2003 SP2 у одного из клиентов. Ошибку 333 сопровождало событие 2019 — сервер не смог выделить память из невыгружаемого пула памяти, так как он пуст. Наличие ошибки 2019 указывало на то, что проблема заключается в истощении ресурсов, поэтому следующим шагом был поиск драйвера, допускающего утечку памяти. Как показано на экране 1, выходные данные команды poolmon.exe позволяют определить тэг, резервирующий максимальный объем памяти.

Выходные данные Poolmon.exe, позволяющие определить тэг, допускающий утечку памяти

Для быстрого определения тэга, допускающего утечку, следует воспользоваться параметром -b, чтобы выполнить сортировку выходных данных по числу потребляемых байтов для каждого тэга. В самом верху таблицы указан тэг, потребляющий максимальную память (в байтах).

Следующий шаг — использование встроенной утилиты Windows Findstr для нахождения драйвера, ассоциированного с тэгом NTID:

C:>findstr/m/s "NTID" *.sys

Параметр/m предписывает вывод только имени файла, а параметр /s предусматривает поиск только в текущей папке и ее вложенных папках. Выходным результатом Findstr оказался драйвер C:WINDOWSSYSTEM32DRIVERSCPQTEAM.?SYS.

Зная тэг распределения пула и имя драйвера, допускающего утечку памяти, мы осуществили простой поиск по контексту «NTID CPQTEAM». В результатах поиска была обнаружена ссылка на технический форум компании HP, где обсуждалась утечка памяти (forums13.itrc.hp.com/service/forums/questionanswer.do? admit=109447627+1227565774017+28353475& threadId=1147757), связанная с конкретной версией драйвера Cpqteam.sys.

Случай 2. Отслеживание интенсивного использования реестра

Событие 1517Не все ошибки с ID 333, однако, вызваны проблемами ресурсов. Некоторые из них нельзя связать с истощением памяти. Одна из подобных ситуаций в моей практике возникла на сервере служб терминалов, где ошибка 333 «наводняла» системный журнал. С помощью системного монитора удалось выяснить, что показатель «процент использования квоты реестра» превышает 98 (т. е. система использует более 98% разрешенной системной квоты на размер реестра). Установив, что система интенсивно использует реестр, мы вновь просмотрели записи в журнале событий приложений за период с момента возникновения проблемы, и среди них оказалось событие 1517, показанное на экране 2.

Событие 1517 указывает на то, что реестр не освобождается при завершении сеанса пользователей системы. Между этой информацией и показанием счетчика «процент использования квоты реестра» в системном мониторе существует взаимосвязь. Выполнив поиск в «справке и поддержке» Microsoft по контексту «1517» и «реестр», мы нашли статью на support.microsoft.com
/kb/944984 с решением данной проблемы.

Dureg.exe — еще одна утилита, широко используемая для диагностики ошибок 333. Выходные данные Dureg.exe нужно собрать один раз, еще до возникновения неполадок, а затем вновь — в ходе проблемного периода, чтобы определить, не наблюдается ли «раздувание» реестра. Первое выполнение dureg.exe (до обнаружения проблемы) выглядит так:

C:>dureg.exe/a
Size of HKEY_CLASSES_ROOT: 11627272
Size of HKEY_USERS: 56739224
Size of HKEY_LOCAL_MACHINE: 47719408
Total Registry data size: 115985904

Второй раз dureg.exe следует выполнить при возникновении замедленной регистрации в системе и появлении ошибок 333:

C:>dureg.exe/a
Size of HKEY_CLASSES_ROOT: 11879338
Size of HKEY_USERS: 335257592
Size of HKEY_LOCAL_MACHINE: 46006166
Total Registry data size: 392142994

Можно заметить увеличение размера раздела HKEY_USERS — с 56 до 334 Мбайт. Хотя этот факт не обязательно содержит решение возникшей проблемы, данная информация дает ценную отправную точку для проведения анализа, что может значительно ускорить процесс исправления ошибки.

В данном примере логично выполнить regedit и перейти в папку HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersionTerminal ServerInstallSoftware. Затем следует искать дублированные разделы реестра, связанные с каким-либо приложением, поскольку значения этого раздела копируются в профиль пользователя (HKEY_USERS) при его входе в сеанс на терминальном сервере. Возможно, одно из приложений заполняет раздел Software значениями, что в результате вызывает «раздувание» реестра и ошибку 333. Одного лишь удаления дублированных значений из раздела HKEY_USERS недостаточно, поскольку при очередной регистрации пользователя дублированные разделы будут вновь копироваться из раздела Software в раздел HKEY_USERS, и проблема останется.

Ускоренное решение проблемы

Диагностика ошибок 333 может оказаться сложной, но теперь мы знаем, как облегчить этот процесс. С помощью системного монитора, команд poolmon.exe и dureg.exe можно выявить причины возникновения ошибок 333 и использовать эту информацию для более быстрого поиска решения.

Майкл Моралес (morales@microsoft.com) — старший инженер службы поддержки Microsoft Global Escalation Services. Специализируется на проблемах отладки и производительности Windows