Автор выражает благодарность Мэтью Джастису, инженеру по разработке Microsoft, который помог в подготовке статьи

Администраторам, вероятно, знакомы проблемы истощения кучи рабочего стола (например, выдача сообщения «недостаточно памяти» или отказ запуска приложения) и известно по собственному опыту, как сложно их решать. Во-первых, необходимо установить, что конкретный симптом связан с истощением кучи рабочего стола. Во-вторых, требуется определить, какой процесс или служба потребляют максимальный объем ресурсов и какой параметр реестра надо изменить, чтобы исправить ситуацию. Я покажу, как быстро установить факт истощения кучи рабочего стола системы. Список общих признаков истощения кучи рабочего стола приведен ниже. Затем я расскажу об инструментах и оптимальных методах, которые помогут решить проблему полностью или частично, прежде чем придется обращаться в службу технической поддержки.

Внутренняя организация Windows

Прежде чем приступать к диагностике истощения кучи рабочего стола, необходимо ознакомиться с основными особенностями внутренней организации Windows, чтобы понять причины возникновения этой проблемы. У Windows 2000 и более старых систем есть реконфигурируемая область памяти режима ядра, называемая сеансовым пространством. Сеансовое пространство представляет собой изолированную программную среду окон и рабочих столов отдельного пользователя.

Необходимо также знать, что каждый сеанс (например, сеанс 0, сеанс 1) включает рабочие станции, определяющие границы зоны безопасности рабочих столов. Термин «рабочий стол» заставляет думать об интерактивной рабочей среде, которую видит каждый пользователь при регистрации в системе Windows, однако не каждый рабочий стол непосредственно взаимодействует с пользователем. Каждая рабочая станция содержит объекты рабочего стола, а каждый сеанс имеет одну интерактивную рабочую станцию под названием WinSta0, которую пользователь видит при регистрации в системе.

Другое объяснение концепции древовидной организации рабочего стола: каждый порожденный процесс Win32 принадлежит рабочему столу; каждый рабочий стол принадлежит рабочей станции. В рамках отдельного сеанса с пользователем взаимодействует лишь одна рабочая станция, тогда как все прочие — нет. Каждая рабочая станция принадлежит сеансу. На рисунке схематично представлено дерево рабочих столов типовой системы. На этом рисунке приведены два сеанса: сеанс 0 и сеанс 1. Сеанс 0 относится к выполнению служб и представлению консоли (до Windows Vista). Все прочие — сеанс 1 или сеанс 2 — представляют службы терминалов или быстрое переключение пользователей.

Древовидная схема рабочих столов

Что такое куча рабочего стола?

Каждому объекту рабочего стола необходима память для сохранения объектов пользовательского интерфейса, в частности окон и меню. Эта память называется кучей рабочего стола. Когда приложению требуется объект графического интерфейса, из библиотеки user32.dll вызываются функции выделения памяти из кучи рабочего стола. Каждому рабочему столу отведена одна куча, ресурсы для которой выделяются из пространства сеансового представления, которое является подмножеством сеансового пространства.

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

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

Обсудим методы, позволяющие значительно упростить диагностику истощения кучи рабочего стола. Утилита Desktop Heap Monitor 8.1 (Dheapmon), доступная для загрузки по ссылке tinyurl.com/Dheapmon, является удобным инструментом для Windows XP или Windows Server 2003 (Dheapmon не работает с Vista и Windows Server 2008). Эта программа выдает удобное меню с указанием общего числа рабочих столов, сеансов и рабочих станций. Как показано на экране 1, выходными данными этой программы являются выраженные в процентах показатели использования памяти каждого рабочего стола.

Выходные данные Dheapmon

Наиболее важные выходные показатели Dheapmon, находящиеся в столбце Used Rate (%), позволяют выявить рабочие столы, ресурсы которых полностью исчерпаны (на 90% и более). Другой отслеживаемый показатель — значение Total Desktop, указывающее на общий объем памяти, выделенной для всех рабочих столов. Когда это значение приближается к общему размеру пространства сеансового представления, система Windows не может создавать новые рабочие столы в сеансе. В этом случае может понадобиться изменить соответствующее значение в реестре, чтобы увеличить используемый по умолчанию размер пространства сеансового представления. В таблице показаны используемые по умолчанию размеры пространства сеансового представления для Windows 2000, XP и Windows 2003.

*Настройки для Windows 2000 с активными службами терминалов и модулем коррекции 318942 или более новым для ядра.

Прежде чем менять значение параметра в реестре, необходимо попытаться определить процесс, потребляющий максимальный объем ресурсов, чтобы узнать, какие условия в системе вызывают истощение памяти кучи рабочего стола. Один из наиболее простых способов определить основного потребителя ресурсов — запустить диспетчер задач, на вкладке «Процессы» выбрать «Вид», «Выбрать столбцы» и поставить отметку флажка «Объекты USER». Щелчком в верхней части столбца меняем порядок сортировки на нисходящий, что позволяет сразу увидеть приложение или службу, потребляющую максимальный объем памяти кучи рабочего стола. Определение главного потребителя ресурсов важно, поскольку может указать на проблему, связанную с этой службой или приложением и требующую дальнейшего анализа, тогда как простое изменение настроек параметров реестра лишь замаскирует проблему. Данные в столбце «Объекты USER» диспетчера задач помогут также определить приложение или службу, потребляющую максимальный объем памяти рабочего стола, в системе Vista и Server 2008.

Параметры реестра, определяющие размер пространства сеансового представления

Для XP, Windows 2003 и Windows 2000 размер пространства сеансового представления можно задать с помощью параметра реестра SessionViewSize (REG_DWORD). Значение параметра указывается в мегабайтах. Заметим, что в Vista и более поздних системах этот параметр не применяется, поскольку пространство сеансового представления увеличивается по мере необходимости. Значения, приведенные в таблице, относятся к 32-разрядным системам x86, не загружаемым с использованием переключателя/3GB. Чтобы актуализировать измененное значение параметра реестра, нужно перезагрузить систему. Параметр располагается в разделе HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSessionManagerMemory Management.

Если требуется изменить размер конкретной кучи рабочего стола (когда Used Rate (%) близко к 90%), существует два возможных способа в зависимости от наличия одного или двух условий. Первое условие возникает, когда данные, возвращаемые утилитой Dheapmon, выявляют истощение кучи рабочего стола, принадлежащей интерактивной рабочей станции (WinSta0) (кроме Disconnect или Winlogon). В этом случае размер кучи рабочего стола можно задать с использованием параметра SharedSection (вторая величина (3072) записи SharedSection= в листинге реестра на экране 2). Далее мы остановимся на значениях этого параметра реестра более подробно.

Пример используемых по умолчанию значений параметра реестра, определяющего размер кучи рабочего стола

Второе условие возникает, когда выходные данные Dheapmon указывают на истощение кучи рабочего стола, принадлежащей неинтерактивной рабочей станции. В этом случае также можно задать размер кучи рабочего стола с использованием параметра SharedSection (третье значение (512) записи SharedSection= на экране 2). Размер каждой кучи рабочего стола определяется в подразделе реестра HKEY_LOCAL_MACHINESystemCurrentControlSetControlSession ManagerSubSystemsWindows. Используемые по умолчанию значения этого параметра реестра выглядят примерно так же, как на экране 2 (они находятся на одной строке в системном реестре).

Как уже упоминалось, числовые значения параметра SharedSection= определяют распределение ресурсов кучи рабочего стола. Эти значения указываются в килобайтах.

  • Первое значение SharedSection (1024) — общий для всех рабочих столов размер кучи. Эта память не относится к выделению рабочего стола из кучи, поэтому данное значение не следует менять, решая проблемы истощения памяти рабочего стола.
  • Второе значение SharedSection (3072) — размер кучи рабочего стола для каждого рабочего стола, ассоциированного с интерактивной рабочей станцией (WinSta0), кроме рабочих столов Disconnect и Winlogon.
  • Третье значение SharedSection (512) — размер кучи рабочего стола для каждого рабочего стола, ассоциированного с неинтерактивной рабочей станцией (обычно — службой). Если это значение отсутствует, размер кучи рабочего стола для неинтерактивных рабочих станций будет аналогичен размеру, указанному для интерактивных рабочих станций (второе значение SharedSection).

Изменения в Vista SP1 и Server 2008

В 32-разрядных версиях Vista SP1 и Server 2008 сеансовое пространство представляет собой динамически распределяемое адресное пространство ядра. Как уже упоминалось, параметр реестра SessionViewSize больше не используется. Это значительное улучшение и одна из причин, почему вам, возможно, не приходилось замечать истощения кучи рабочего стола, работая с Vista или Windows Server 2008, по сравнению с более ранними версиями Windows. Кроме того, второе значение параметра SharedSection, т. е. размер кучи интерактивного рабочего стола, изменено на 12 288 Кбайт


Возможные симтомы истощения кучи рабочего стола

  • отказ запуска приложения (0xc0000142);
  • отказ запуска назначенных заданий;
  • незаметная остановка процессов;
  • элементы пользовательского интерфейса не прорисовываются как следует;
  • событие 243 (ошибка выделения рабочего стола из кучи) в системном журнале.