выгружаемый пул что это
Как исправить невыгружаемый пул Windows 10
Вот спустя время решил себе обновить компьютер, собрал, установил новую Windows 10. И горя не знал. Но заметил что он очень тормозит, после того как открыл диспетчер задач, увидел что невыгружаемый пул памяти постоянно увеличивается, и оперативная память не освобождается. Каждый раз чтобы выгрузить память с невыгружаемого пула приходилось выполнять перезагрузку компьютера.
В этой статье я Вам покажу несколько способов как избавится от проблемы с невыгружаемым пулом памяти. Разберемся что такое невыгружаемый пул и по каким причинам пользователи с ней встречаются. Решил написать статью так как сам часто встречаюсь после каждой чистой установки операционной системы Windows 10.
Что такое невыгружаемый пул памяти
На скриншоте видно где можно посмотреть на невыгружаемый пул, и увидеть явную утечку памяти. Не важно сколько в Вас памяти, все с временем уходит в невыгружаемый пул. При этом нормальные значения невыгружаемого пула располагается в районе до двухсот мегабайт. Именно поэтому после обнаружения утечки памяти рекомендуем воспользоваться нашими способами. Обычное добавление планок оперативной памяти немного отдаляет, но все же не решает проблему.
Эта проблема появляется при активном использовании Интернета с включенным управлением полосой пропускания, происходит утечка памяти на материнских платах с сетевой картой от Killer. Не важно интегрированная это или дискретная сетевая карта. Драйвер netio.sys может забрать хоть всю оперативную память в системе. После перезагрузки компьютера по новой все происходило.
Возможно несколько вариантов устранения проблемы. Я же использовал первый или второй способ для отключения утечки памяти. Но не стоит исключать вариант обновления драйверов сетевой карты. Так как сейчас производители уже выпустили обновленные версии драйверов, автоматически исправляющие ошибки с невыгружаемым пулом памяти Windows 10.
Как исправить невыгружаемый пул оперативной памяти
Службы
Первый способ заключается в отключении службы мониторинга сетевой активности (Windows Network Data Usage Monitoring Driver) в Windows 10. Выполнением буквально одной команды проблема с невыгружаемым пулом памяти будет полностью решена.
Реестр
Перед внесением изменений в реестр рекомендуется создать резервную копию реестра Windows 10. Это предоставит возможность в любой момент при необходимости восстановить любые изменения в реестре.
Для применения изменений выполните перезагрузку компьютера. После включения компьютера память будет освобождаться в автоматическом режиме. Больше утечек оперативной памяти из-за не будет. Смотрите также инструкцию: Как очистить оперативную память на Windows 10.
Драйвера
В некоторых случаях исправить утечки оперативной памяти помогает настройка программного обеспечения к сетевой карте. При этом пользователь теряет весь функционал программы Killer Network Manager.
Сейчас уже с уверенностью можно сказать, что достаточно будет просто обновить драйвера производителя. Сегодня вместо программы Killer Network Manager пользователи получают обновленное средство управления Killer Control Center. В котором разработчики уже решили предыдущие ошибки и проблемы пользователей.
Как на меня самый удобный это первый способ, так как невыгружаемый пул памяти исчезает после отключения всего одной службы. Эта проблема актуальна и для пользователей предыдущих операционных систем.
В этой статье мы рассмотрели как исправить невыгружаемый пул Windows 10 и собственно разобрались что такое невыгружаемый пул памяти. Пишите в комментарии встречались ли Вы с этой проблемой, и как с ней боролись. Надеюсь эта статья была для Вас полезной.
Преодолевая границы Windows: выгружаемый и невыгружаемый пулы
В этот раз я собираюсь поведать о двух фундаментальных ресурсах ядра, выгружаемом (от англ. paged) и невыгружаемом (от англ. nonpaged) пулах, которые основаны на первых двух ресурсах и которые имеют непосредственное влияние на многие другие ограничения системных ресурсов, включая максимальное число процессов, объектов синхронизации и дескрипторов.
Выгружаемый и невыгружаемый пулы представляют собой ресурсы памяти, которые операционная система и драйвера устройств используют для сохранения своих структур данных. Диспетчер пула работает в режиме ядра, используя области системного виртуального адресного пространства (которое описано в статье про виртуальную память) для памяти, которую он выделяет. Диспетчер пула ядра также работает с диспетчером C-runtime и диспетчером динамической памяти Windows, которые выполняются в пользовательском режиме. Поскольку минимальный размер выделяемой виртуальной памяти кратен размеру системной страницы (4KB для систем x86 и x64), эти вспомогательные диспетчеры памяти делят большие выделяемые участки памяти на маленькие части, чтобы память не расходовалась впустую.
Например, если приложению требуется 512-байтный буфер для хранения данных, диспетчер динамической памяти берет одну из областей, которые он может выделить, и отмечает, что первые 512 байт используются, возвращая указатель на этот участок памяти и помещает оставшуюся память в список, который он использует для хранения информации о свободных областях динамической памяти.
Поэтому невыгружаемый пул всегда находится в физической памяти и виртуальной памяти невыгружаемого пула назначена физическая память. Общие системные структуры данных хранятся в невыгружаемом пуле, включая ядро и объекты, которые представляют процессы и потоки, объекты синхронизации, такие как мьютексы, семафоры и события, ссылки на файлы, которые представлены как файловые объекты, и пакеты запросов ввода/вывода (IRP), которые представлены как операции ввода/вывода.
Выгружаемый пул
Выгружаемый пул, с другой стороны, получил свое название потому, что Windows может записать данные, которые он хранит, в файл подкачки, позволяя тем самым использовать физическую память, которая при этом освобождается, в других целях. Как и в случае с виртуальной памятью пользовательского режима, когда драйвер или система ссылается на выгружаемый пул памяти, которых находится в файле подкачки, и диспетчер памяти считывает данные обратно в физическую память. Самым большим потребителем выгружаемого пула, по крайней мере в Windows Vista и более поздних ОС, обычно является системный реестр, так как ссылки на ключи и другие структуры данных реестра хранятся в выгружаемом пуле. Структуры данных, которые представлены в виде отображаемых на память файлов, называемых секциями, также хранятся в выгружаемом пуле.
Просмотр информации об использовании выгружаемого и невыгружаемого пулов.
Есть три счетчика, показывающих информацию об использовании пула:
После того, как вы настроите символы, откройте диалоговое окно System Information (кликните на пункте System Information меню View или нажмите Ctrl+I), чтобы увидеть информацию о пуле в секции Kernel Memory. Вот как это выглядит в системе Windows XP с 2Гб памяти:
Как я упоминал в предыдущей статье, в 32-битной Windows системное адресное пространство по умолчанию составляет 2Гб. По сути, это значение устанавливает границу для невыгружаемого пула (или любого типа системной виртуальной памяти) в 2Гб, но он должен делить это пространство с другими типами ресурсов, такими как собственно ядро, драйвера устройств, системные входы таблицы страниц (PTE) и представления системных файлов.
До Vista диспетчер памяти в 32-битных Windows вычислял, сколько адресного пространства назначать каждому типу ресурсов во время загрузки. Его формулы принимали во внимание множество факторов, главным из которых являлось количество физической памяти в системе. Объем адресного пространства, выделяемого им для невыгружаемого пула, начинается с 128Мб для системы с 512Мб системной памяти и достигает 256Мб для систем с 1Гб памяти и более. На системе, загруженной с опцией /3GB, которая расширяет адресное пространство пользовательского режима до 3Гб за счет адресного пространства ядра, максимальный размер невыгружаемого пула составляет 128Мб. На предыдущем снимке Process Explorer отображается максимум в 256Мб на системе Windows XP с 2Гб системной памяти, загруженной без флага /3GB.
Диспетчер памяти в Windows Vista и в более поздних версиях системы, включая Server 2008 и Windows 7 (32-битной версии Windows Server 2008 R2 нет) не реализует статическое разделение системного адресного пространства; вместо этого, он динамически назначает диапазоны адресов различным типам памяти согласно изменяющимся требованиям. Однако, он все еще назначает максимальный размер невыгружаемого пула, который основывается на количестве физической памяти, равный чуть больше чем 75% от физической памяти или двум гигабайтам, в зависимости от того, что меньше. Вот максимум для системы Windows Server 2008 с 2Гб оперативной памяти:
64-х битные системы Windows обладают гораздо большим адресным пространством, так что диспетчер памяти может спокойно распределять его статически, не беспокоясь о том, что какому-то типу данных не будет хватать места. 64-битная Windows XP и Windows Server 2003 устанавливают максимальный размер невыгружаемого пула немногим более 400Кб на каждый мегабайт оперативной памяти или в 128Гб, в зависимости от того, что меньше. Вот снимок из системы с 64-битной Windows XP и 2Гб памяти:
Диспетчеры памяти 64-битных Windows Vista, Windows Server 2008, Windows 7 и Windows Server 2008 R2, так же как и их 32-битные аналоги (за исключением Windows Server 2008 R2, у которого, как уже упоминалось ранее, нет 32-битной версии) устанавливают ограничение на размер невыгружаемого пула приблизительно в 75% от RAM, однако максимальное значение для него равно 128Гб вместо 2Гб. Вот скриншот системы с 64-битной Windows Vista с 2Гб системной памяти, для которой ограничение на размер невыгружаемого пула равно таковому для системы с 32-битной Windows Server 2008, снимок которой приведен ранее:
И наконец, вот данное ограничение для системы с 64-битной Windows 7 с 8Гб памяти:
Вот сводная таблица ограничений на размер невыгружаемого пула для различных версий Windows:
Ограничения на размер выгружаемого пула
Ядро и драйверы устройств используют выгружаемый пул для хранения любых структур данных, которые никогда не будут вызываться изнутри DPC или ISR, или когда спинлок (spinlock) занят. Именно поэтому содержимое выгружаемого пула может либо находиться в физической памяти, либо, если алгоритмы работы диспетчера памяти решат использовать данную физическую память для других целей, быть записано в файл подкачки, откуда его, если это понадобиться, можно возвратить обратно в физическую память. Потому ограничение на размер выгружаемого пула прежде всего зависит от объема системного адресного пространства, выделяемого для выгружаемого пула диспетчером памяти.
Для 32-х битной Windows XP данный предел вычисляется исходя из того, сколько адресного пространства выделено другим ресурсам, в особенности таблице PTE, с максимальным значением в 491Мб. Для системы с Windows XP и 2Гб системной памяти данное ограничение равно 360Мб:
32-х битный Windows Server 2003 резервирует для выгружаемого пула больше места, так что верхний предел в этом случае равен 650Мб.
Так как 32-битная Windows Vista и все последующие системы реализуют динамическое адресное пространство ядра, для них данное ограничение просто установлено в 2Гб. Потому увеличение размера выгружаемого пула прекратится тогда, когда системное адресное пространство заполнится, либо когда будет достигнут установленный системой предел.
64-х битные Windows XP и Windows Server 2003 устанавливают этот максимум равным ограничению на размер невыгружаемого пула, умноженного на четыре, либо 128 Гб, в зависимости от того, что окажется меньше. Вот снимок системы с 64-битной версией Windows XP, на котором предел размера выгружаемого пула равен как раз четырем размерам невыгружаемого пула:
И наконец, 64-битные версии Windows Vista, Windows Server 2008, Windows 7 и Windows Server 2008 R2, просто устанавливают данный максимум в 128Гб, позволяя тем самым с помощью ограничения на размер выгружаемого пула определить системное ограничение. Вот скриншот системы с 64-битной Windows 7:
Вот сводная таблица ограничений на размер выгружаемого пула для различных операционных систем:
Я запускал Notmyfault на множестве тестовых систем на виртуальных машинах, чтобы увидеть, как как они поведут себя и не встретятся ли с какими-нибудь системными ошибками. После того, как невыгружаемый пул на системе с 64-битной Windows XP бы исчерпан, попытка запуска командной строки завершилась следующим диалоговым окном:
В 32-битной Windows Server 2008 с уже запущенной командной строкой после того, как невыгружаемый пул был исчерпан, даже простые операции, такие как изменения текущей директории или вывод списка директорий, завершались с ошибкой:
На одной из тестовых систем я увидел сообщение об ошибке, в котором была указано, что, возможно, данные были потеряны. Надеюсь, вы никогда не увидите подобного диалогового окна на вашей реальной системе!
Такие же ошибки возникали и в случае исчерпания выгружаемого пула. Вот результаты попытки запуска Блокнота из командной строки на системе с 32-битной Windows XP, после того как выгружаемый пул был исчерпан. Обратите внимание на то, что Windows не смогла запустить перерисовку заголовка окна, а также выдавала различные ошибки при каждой новой попытке запуска приложения:
А вот пример того, как на системе с 64-битной Windows Server 2008 после исчерпания выгружаемого пула в папке Стандартные меню Start не оказалось ни одного пункта:
На данном снимке вы можете видеть максимальный уровень занимаемой памяти (который также отображается в диалоговом окне System Infomations программы Process Explorer), который стремительно повышается по мере того, как Notmyfault совершает утечку крупных участков выгружаемого пула и достигает максимума в 2Гб на системе, работающей по управлением 32-битной версии Windows Server 2008 с 2Гб оперативной памяти:
Причина, по которой Windows не зависает после того, как пул был исчерпан, даже при том, что система неработоспособна, состоит в том, что подобная ситуация может быть временной, возникшей вследствие пика рабочей нагрузки, после которого пул будет освобожден и система сможет вернуться в нормальный режим работы. Однако, если пул опустошает драйвер (или ядро), причина такой утечки становится важной. В этом случае важную роль играют теги пула, описанные в начале этой статьи.
После того, как вы нашли искомый тег в левой колонке (в данном случае это «Leak»), следующим шагом будет нахождение драйвера, использующего этот тег. Так как эти теги хранятся в образе драйвера, вы можете просканировать данный образ на наличие рассматриваемого тега. Утилита String от Sysinternals сохраняет искомые строки в указанном вами файле (искомая строка по умолчанию должна быть не короче 3-х символов, и, так как большинство образов драйверов находятся в директории %Systemroot%\System32\Drivers, вы можете открыть командную строку, изменить текущую директорию на указанную и выполнить команду «strings * | findstr «. После того, как вы найдете соответствия, вы можете получить информацию о версии драйвера с помощью утилиты Sigcheck Sysinternals. Вот как выглядит процесс поиска драйвера, использующего тег «Leak»:
Используйте утилиту Strings для поиска в дампе информации о драйвере, использующем тег, определенный вами как причина утечки.
На данный момент в этой серии статей я рассказал вам о самых фундаментальных ограничениях Windows, включая физическую память, виртуальную память, выгружаемый и невыгружаемый пулы. В следующий раз я расскажу об ограничениях на количество процессов и потоков, поддерживаемого Windows, которые основываются на этих основных системных ограничениях.
Администрирование процессов в диспетчере задач
Во вкладке Процессы (Processes) окна диспетчера задач отображается детальная информация обо всех процессах, выполняемых и данный момент, включая процессы операционной системы, локальные службы, процессы как интерактивного пользователя (зарегистрировавшегося с локальной консоли), так и удаленных пользователей. Чтобы скрыть процессы удаленных пользователей, сбросьте флажок Отображать процессы всех пользователей (Show Processes From All Users).
Поля на вкладке Процессы (Processes) содержат много информации о выполняющихся процессах. При помощи этой информации вы определите, какие процессы чрезмерно загружают системные ресурсы, например, процессорное время и память.
По умолчанию отображаются следующие поля:
• Имя образа (Image Name) Имя процесса или исполняемого файла, запустившего процесс.
• Пользователь (User Name) Имя пользователя или системной службы, запустившей процесс.
• ЦП (CPU) Доля ресурсов процессора, занятая данным процессом (в процентах).
• Память (частный рабочий набор) (Memory (Private Working Set)) Объем памяти, используемой процессом в данный момент.
• Описание (Description) Описание процесса.
Выберите в меню Вид (View) команду Выбрать столбцы (Select Columns), чтобы добавить столбцы на вкладку Процессы (Processes).
Когда в системе возникли проблемы, полезными могут оказаться следующие столбцы:
• Базовый приоритет (Base Priority) Базовый приоритет определяет, сколько системных ресурсов выделяется процессу. Чтобы задать приоритет процесса, щелкните процесс правой кнопкой мыши, выберите команду Приоритет (Set Priority) и выберите один из следующих вариантов: Низкий (Low), Ниже среднего (Below Normal), Средний (Normal), Выше среднего (Above Normal), Высокий (High) и Реального времени (Real-Time). Большинство процессов по умолчанию имеет средний приоритет. Наивысший приоритет назначается процессам реального времени.
• Время ЦП (CPU Time) Общее количество циклов процессора, использованное процессом с момента запуска. Чтобы быстро выявить процессы, которые в наибольшей мере загружают процессор, выведите этот столбец и щелкните его заголовок, чтобы отсортировать записи о процессах по времени ЦП.
• Дескрипторы (Handle Count) Общее количество дескрипторов файлов, обрабатываемых процессом. Счетчик дескрипторов позволяет оценить, насколько процесс зависит от файловой системы. С некоторыми процессами, например, с процессами Microsoft Internet Information Services (IIS), связаны тысячи открытых дескрипторов файлов. Для обслуживания каждого дескриптора требуется системная память.
• Число чтений (I/O Reads), Число записей (I/O Writes) Общее число дисковых операций чтения или записи с момента запуска процесса. Оба этих параметра говорят о том, сколько дисковых операций произведено процессом. Если число чтений и записей растет непропорционально действительной нагрузке на сервер, возможно, процесс не кеширует файлы или кеширование настроено неправильно. В идеале кеширование должно снижать потребность в операциях чтения и записи.
• Ошибки страниц (Page Faults) Ошибка страницы происходит, когда процесс запрашивает страницу в памяти, а система не может найти ее в запрошенном месте. Если запрошенная страница находится в другой области памяти, ошибка называется программной (soft page fault). Если запрошенная страница отсутствует на диске, ошибка называется аппаратной (hard page fault). Большинство процессоров способны обработать большое число программных ошибок. Дисковые ошибки могут привести к значительным задержкам.
• Память — выгружаемый пул (Paged Pool), Память — невыгружаемый пул (Nonpaged Pool) Выгружаемый пул — область системной памяти для объектов, которые можно записать на диск, если они не используются. Невыгружаемый пул — область системной памяти для объектов, которые нельзя записывать на диск. Следует обратить внимание на процессы, которым требуется большой объем невыгружаемой памяти. Если на сервере недостаточно свободной памяти, эти процессы могут стать причиной большого числа ошибок страниц.
• Память — пик рабочего набора (Peak Memory Usage) Максимальный объем памяти, использованный процессом. Важно также следить за разницей между текущим и пиковым использованием памяти. Приложениям с большой разницей между типичным и максимальным объемом занимаемой памяти, например, Microsoft SQL Server, необходимо выделить при запуске больше памяти, чтобы они работали эффективнее.
• Счетчик потоков (Thread Count) Текущее количество потоков, используемых процессом. Большинство серверных приложений — многопоточные. Многопотоковость обеспечивает одновременное выполнение запросов процесса. Некоторые приложения способны динамически управлять числом потоков для повышения своей производительности. С другой стороны, чрезмерное количество потоков может привести к снижению производительности, поскольку операционной системе приходится слишком часто переключаться между контекстами потоков.
В списке выполняющихся процессов вы увидите процесс Бездействие системы (System Idle Process). Задать приоритет этого процесса нельзя. В отличие от других процессов, использующих системные ресурсы, процесс Бездействие системы (System Idle Process) отслеживает незанятые системные ресурсы. Число 99 в столбце ЦП (CPU) для процесса Бездействие системы (System Idle Process) означает, что 99% процентов ресурсов процессора в данный момент не используется.
Просматривая процессы помните, что одно приложение может породить несколько процессов. Обычно они зависимы от главного процесса, начиная с которого формируется дерево зависимых процессов. Чтобы найти главный процесс приложения, щелкните правой кнопкой приложение на вкладке Приложения (Applications) и выберите команду Перейти к процессу (Go То Process). Если вы хотите завершить процесс, обычно следует указывать главный процесс приложения, а не зависимые процессы. Это гарантирует полную остановку приложения.
Есть несколько способов остановить главный процесс приложения и все зависимые процессы:
• выделить приложение на вкладке Приложения (Applications) и щелкнуть кнопку Снять задачу (End Task);
• щелкнуть правой кнопкой главный процесс приложения на вкладке Процессы (Processes) и выбрать команду Завершить процесс (End Process) или щелкнуть одноименную кнопку;
• щелкнуть правой кнопкой главный или зависимый процесс на вкладке Процессы (Processes) и выбрать команду Завершить дерево процессов (End Process Tree).