23

Я заметил это на разных компьютерах с Windows, во многих других случаях: использование оперативной памяти, сообщаемое диспетчером задач или монитором ресурсов, часто, по-видимому, в сумме значительно меньше, чем фактическое использование.

Например, много раз на моем ноутбуке или рабочем столе я видел что-то вроде 7 ГБ, и все же общее количество Рабочего набора ОЗУ больше похоже на 3 ГБ. Я просто не могу понять, где это используется!

Вот крайний пример, который я заметил сегодня в Resource Monitor на сервере:

Монитор ресурсов
Нажмите для полного размера

Если вы щелкнете правой кнопкой мыши по изображению и откроете новую вкладку и увидите числа, вы заметите, что рабочий набор (не включающий нефизическую виртуальную память) составляет около 1,7 ГБ. Я получаю похожие цифры, добавляя использование оперативной памяти в диспетчере задач, когда включена функция "Показывать процессы от всех пользователей".

Теперь вот скриншот вкладки Performance диспетчера задач:

Диспетчер задач
Нажмите для полного размера

Это говорит о том, что используется 7,6 ГБ физической памяти.

Я вижу это все время на персональных компьютерах, ноутбуках, а теперь и на серверах: общее использование ОЗУ, сообщаемое системными инструментами, составляет только 1/4 от объема ОЗУ, который я наблюдаю. WTF продолжается ???

Есть ли удовлетворительное объяснение того, где находится вся моя оперативная память? Что поглощает это, и почему это не оставляет следа?

РЕДАКТИРОВАТЬ: Вот изображение графического использования ОЗУ, как пользователь просил:

Использование RamMap
Нажмите для полного размера

РЕДАКТИРОВАТЬ 2: В ответ на ответ Джеймса, вот картина невыгружаемых процессов в poolmon.exe , отсортированных по размеру:

Эти результаты меня смущают. poolmon правильно утверждает, что у меня есть 6 ГБ невыгружаемого пула в использовании, но все процессы невыгружаемого пула имеют размер менее 8 МБ.

Что бы это могло значить? Неужели poolmon не может обнаружить некоторые процессы, использующие невыгружаемый пул?

1 ответ1

23

Извините, я знаю, это звучит как легкомысленный ответ ... но ответ на вопрос в вашем названии: "потому что они не должны".

Или, если выразить это более вежливо: ОЗУ активно используется не в частных рабочих наборах процессов. Некоторые из них находятся в общих рабочих наборах процессов - но вы не можете получить надежное представление о фактическом использовании там из-за совместного использования; сложение номеров процессов даст вам слишком большой результат.

Другие элементы, занимающие ОЗУ, такие как пул невыгружаемого пула, резидентная часть выгружаемого пула и резидентные части других областей использования ядра, вообще не отображаются на экране "процессов" диспетчера задач.

Относительно вашей конкретной проблемы:

На экране диспетчера задач см. Раздел "память ядра"? У вас есть 6 ГБ "невыгружаемой памяти" (это невыгружаемый пул). Это часть раздела "Используется" на вашем втором графике. Не выгружаемый пул не взимается ни с одного процесса, поэтому суммирование номеров процессов в диспетчере задач не приближается к общему количеству используемых. Какой-то драйвер, скорее всего, использует его. Это совершенно чрезмерное количество; должно быть намного меньше 1 ГБ. какой бы драйвер ни отвечал за чрезмерную часть использования невыгружаемого пула, несомненно, глючит.

RAMmap может подтвердить это (на вкладке "Использовать счетчики", посмотрите на общее количество "Nonpaged Pool"), но это не может помочь вам определить, какой драйвер вызывает его.

Вот как это найти: Получить копию инструмента Microsoft "poolmon". Это инструмент символьного режима (мальчик, так ли это когда-либо), поставляемый с Windows Driver Kit. Для Windows 7 WDK можно загрузить бесплатно. Вы должны загрузить все это (это ISO) и установить его с него, но вы можете установить только инструменты, если это все, что вы хотите.

Найдите poolmon в каталогах WDK - обязательно выберите правильный 32- или 64-разрядный - и запустите его из командной строки администратора. Вы получите такой дисплей:

Теперь нажмите клавишу "p" (нет, я не шучу. Нет меню здесь!) пока в столбце "Тип" не отображается только "Nonp". Затем нажмите "b" (дважды, если необходимо), чтобы отсортировать отображение в порядке убывания по столбцу "Байты" (это уже было сделано в примере здесь).

Затем посмотрите на столбец "Tag" для самой верхней строки. В показанном здесь (явно искусственном) случае это "утечка". (Эта система использует драйвер, который был намеренно прослушан, чтобы вызвать эту проблему - это "утечка" невыгружаемого пула.)

Кстати, выделенные строки - это те, которые изменились с момента предыдущего обновления этого архаичного экрана.

Теперь найдите в c:\Windows\System32\Drivers файл .sys, содержащий эту строку. В этом случае вы будете искать "Утечка", вот так:

c:\windows\system32> findstr /s Leak *.sys

Затем найдите в Интернете ссылки на эту строку и / или имя этого драйвера.

Возвращение сюда и сообщение полного имени, имени производителя и т.д. Из файла .sys также будет полезно.

(Могу поспорить, что найденный тэг будет ECMC, драйвер - intmsd.sys, и он связан с продуктом под названием ExpressCache или IntelliMemory. Я бы "удалил" этот продукт. Существует обновление для исправления проблемы, но даже с фиксированной версией я никогда не видел, чтобы производительность системы улучшалась этим продуктом; по сути дублирует функциональность, которая уже есть в Windows.)

Если вы не можете найти его таким образом, следующим шагом будет использование "Windows Performance Toolkit". Ищите этот форум для этой строки, с ответами magicandre1981, для получения инструкций. Не обращайте внимания на ответы, в которых упоминается xperf - это более старая версия инструмента.

ОБНОВЛЕНИЕ: Согласно комментариям, ОП сделал вышеупомянутое и обнаружил, что хотя poolmon сообщил, что общий размер невыгружаемого пула действительно огромен, все выделенные фрагменты были, по-видимому, крошечными. Моя гипотеза (также в комментариях) заключается в том, что это связано с тем, что я буду называть "раздутым" пулом: пул был выделен, а затем освобожден, но по какой-то причине объем оперативной памяти, выделенной пулу, не был сокращен для отражения "освобождения" , Следуя процедуре, описанной в этом ответе , magicandre может идентифицировать виновника.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .