Я заметил это на разных компьютерах с Windows, во многих других случаях: использование оперативной памяти, сообщаемое диспетчером задач или монитором ресурсов, часто, по-видимому, в сумме значительно меньше, чем фактическое использование.
Например, много раз на моем ноутбуке или рабочем столе я видел что-то вроде 7 ГБ, и все же общее количество Рабочего набора ОЗУ больше похоже на 3 ГБ. Я просто не могу понять, где это используется!
Вот крайний пример, который я заметил сегодня в Resource Monitor на сервере:
Если вы щелкнете правой кнопкой мыши по изображению и откроете новую вкладку и увидите числа, вы заметите, что рабочий набор (не включающий нефизическую виртуальную память) составляет около 1,7 ГБ. Я получаю похожие цифры, добавляя использование оперативной памяти в диспетчере задач, когда включен параметр «Показывать процессы от всех пользователей»
Теперь вот скриншот вкладки Performance диспетчера задач:
Это говорит о том, что используется 7,6 ГБ физической памяти.
Я вижу это все время на персональных компьютерах, ноутбуках, а теперь и на серверах: общее использование ОЗУ, сообщаемое системными инструментами, составляет только около 1/4 от объема ОЗУ, который я наблюдаю. WTF продолжается ???
Есть ли удовлетворительное объяснение того, где находится вся моя оперативная память? Что поглощает это, и почему это не оставляет следа?
РЕДАКТИРОВАТЬ: Вот изображение графического использования ОЗУ, как пользователь просил:
РЕДАКТИРОВАТЬ 2: В ответ на ответ Джеймса, вот картина нестраничных процессов poolmon.exe
, отсортированных по размеру:
Эти результаты меня смущают. poolmon
правильно утверждает, что у меня есть 6 ГБ невыгружаемого пула в использовании, но все процессы невыгружаемого пула имеют размер менее 8 МБ.
Что бы это могло значить? Не poolmon
удается обнаружить некоторые процессы, использующие невыгружаемый пул?
источник
Ответы:
Извините, я знаю, это звучит как легкомысленный ответ ... но ответ на вопрос в вашем названии: "потому что они не должны".
Или, если выразить это более вежливо: ОЗУ широко используется в частных рабочих наборах процессов. Некоторые из них находятся в общих рабочих наборах процессов - но вы не можете получить надежное представление о фактическом использовании там из-за совместного использования; сложение номеров процессов даст вам слишком большой результат.
Другие элементы, занимающие оперативную память, такие как пул невыгружаемого пула, резидентная часть выгружаемого пула и резидентные части других областей использования ядра, вообще не отображаются на экране «процессов» диспетчера задач.
Относительно вашей конкретной проблемы:
На экране диспетчера задач см. Раздел «память ядра»? У вас есть 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, содержащий эту строку. В этом случае вы будете искать «Утечка», вот так:
Затем найдите в Интернете ссылки на эту строку и / или имя этого драйвера.
Возвращение сюда и сообщение полного имени, имени производителя и т. Д. Из файла .sys также будет полезно.
(Могу поспорить, что найденный тэг будет ECMC, драйвер - intmsd.sys, и он связан с продуктом под названием ExpressCache или IntelliMemory. Я бы «удалил» этот продукт. Существует обновление для устранения проблемы, но даже с фиксированной версией я никогда не видел, чтобы производительность системы улучшалась этим продуктом, он по сути дублирует функциональность, которая уже есть в Windows.)
Если вы не можете найти его таким образом, следующим шагом будет использование «Windows Performance Toolkit». Ищите этот форум для этой строки, с ответами magicandre1981, для получения инструкций. Игнорируйте ответы, в которых упоминается xperf - это более старая версия инструмента.
ОБНОВЛЕНИЕ: Согласно комментариям, OP сделал вышеупомянутое и обнаружил, что, хотя poolmon сообщил, что общий размер невыгружаемого пула действительно огромен, все выделенные фрагменты были, очевидно, крошечными. Моя гипотеза (также в комментариях) заключается в том, что это связано с тем, что я буду называть «раздутым» пулом: пул был выделен, а затем освобожден, но по какой-то причине объем оперативной памяти, выделенной пулу, не был сокращен для отражения «освобождения» , Следуя процедуре, описанной в этом ответе , magicandre может идентифицировать виновника.
источник
poolmon
сегодня, если у меня будет время, и постараюсь прочитать ваш ответ более внимательно, чтобы убедиться, что я его понимаю. Вы говорите, что, возможно, утечка памяти? Если это так, то это вполне правдоподобно, так как мы работаем над программным обеспечением, которое, как известно, имеет некоторые ужасные утечки памяти.poolmon.exe
на данном сервере и отредактировал свой вопрос, добавив скриншот.poolmon
заявляет, что у меня есть 6ГБ невыгружаемого пула (как вы указали на скриншоте диспетчера задач), но когда я смотрю только на процессы «Nonp» и сортирую по размеру, они все крошечные (самый большой - 8МБ). Есть ли у вас какие-либо идеи, почемуpoolmon
не определяется основная часть использования невыгружаемого пула?