Почему общее использование ОЗУ монитором ресурсов и диспетчером задач даже удаленно не влияет на общее использование физической памяти? [Дубликат]

30

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

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

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

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

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

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

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

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

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

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

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

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

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

введите описание изображения здесь

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

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

DumpsterDoofus
источник
Можете ли вы опубликовать изображение вашего монитора ресурсов> вкладка Память (только нижняя часть с цветами и цифрами). Это было бы более красноречивым.
WHS
2
@Ramhound: Спасибо, что указали мне на эту ссылку! К сожалению, как я только что просил, я загрузил изображение графической карты физической памяти Resource Monitor, и резервная часть физической памяти составляет менее 2% от общего объема используемой оперативной памяти. Ответ Дэвида Шварца предполагает, что «скрытое» использование ОЗУ происходит из ОЗУ в режиме ожидания (т. Е. ОЗУ, используемое для кэшированных данных и неиспользуемого кода), и это не так. Таким образом, я не думаю, что ответ Дэвида объясняет, что происходит.
DumpsterDoofus
Воспользуйтесь программой RamMap и изучите ее подробнее. Пока что это может быть какой-то сумасшедший водитель? но на самом деле это не резерв (кеш). Запускаете ли вы какие-либо специальные программы, которые позволяют починить оперативную память или предполагают ускорение работы компьютера? Какие-нибудь странные элементы драйвера, которые будут особенными для ваших компьютеров?
Psycogeek
2
Ссылка на «ответил раньше» не распространяется на этот случай.
Джейми Ханрахан

Ответы:

30

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

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

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

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

На экране диспетчера задач см. Раздел «память ядра»? У вас есть 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 - это более старая версия инструмента.

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

Джейми Ханрахан
источник
Спасибо, что взяли на себя расследование дальше, чем другие! Я буду искать утечку, используя poolmonсегодня, если у меня будет время, и постараюсь прочитать ваш ответ более внимательно, чтобы убедиться, что я его понимаю. Вы говорите, что, возможно, утечка памяти? Если это так, то это вполне правдоподобно, так как мы работаем над программным обеспечением, которое, как известно, имеет некоторые ужасные утечки памяти.
DumpsterDoofus
@DumpsterDoofus: Да. Вероятно, утечка памяти в драйвере режима ядра. Это отличается от утечки памяти в приложении.
Джейми Ханрахан
Итак, я наконец-то приступил к работе poolmon.exeна данном сервере и отредактировал свой вопрос, добавив скриншот. poolmonзаявляет, что у меня есть 6ГБ невыгружаемого пула (как вы указали на скриншоте диспетчера задач), но когда я смотрю только на процессы «Nonp» и сортирую по размеру, они все крошечные (самый большой - 8МБ). Есть ли у вас какие-либо идеи, почему poolmonне определяется основная часть использования невыгружаемого пула?
DumpsterDoofus
2
Ах ... проблема здесь в слове "использование". Таким образом, у вас есть 6 ГБ невыгружаемого пула, но, похоже, в настоящее время используется только его часть. Увы, ничего из того, что я знаю (ни TM, ни poolmon, ни RAMmap), не показывает, какая часть пула фактически используется. Я предполагаю, что когда-то был большой пользователь пула, поэтому пул был расширен, чтобы вместить его, а затем тяжелый пользователь ушел. Из-за способа обработки пула нелегко освободить ОЗУ, выделенное ему, если только распределение не было выполнено в виде больших смежных блоков. Я бы посоветовал посмотреть это после свежего запуска системы.
Джейми Ханрахан
Существует версия poolmon.exe, доступная в средствах поддержки для Server 2003 ( serverfault.com/questions/84479/… ) - немного устаревшая, но она загружается всего 5,2 МБ и по-прежнему работает (по крайней мере) на Server 2016.
Mwfearnley