Windows использует слишком много оперативной памяти, как диагностировать ресурсы


73

У меня 16 ГБ системной оперативной памяти. При запуске без открытых приложений, кроме диспетчера задач Windows использует около 3 ГБ ОЗУ. Я посмотрел на вкладке процессов, но, кажется, ничего необычного. Как я могу узнать, почему моя Windows использует так много оперативной памяти.

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

все процессы от всех пользователей

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


При чтении из poolmon кажется, что мой драйвер беспроводной связи использует около 0,4 ГБ оперативной памяти. Даже если я удалю его, при запуске все равно будет 2,6 ГБ, что все равно слишком много.

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


После переустановки драйвера беспроводной связи произошла утечка памяти. У меня есть новый скриншот, и я хочу подтвердить, что это действительно утечка памяти.

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


3
Прежде всего, у вас есть только 12 ГБ. Либо одна из четырех ваших 4-гигабайтных флешек плохая или плохо сидит, либо ваша материнская плата не поддерживает 16 ГБ. Во-вторых, вы пытались запустить какие-либо программы безопасности для проверки на наличие вредоносных программ? Security Essentials встроен, поэтому обязательно обновите его определения и запустите сканирование. Также попробуйте некоторые анти-руткит-программы, так как руткиты специально скрывают (хотя они также обычно стараются держать низкий профиль, чтобы остаться незамеченным, и использование нескольких гигабайт оперативной памяти вряд ли вписывается).
Synetech

Возможно, вы захотите посмотреть на производительность -> Монитор ресурсов
Путешественник Geek

Попробуйте выполнить команду tasklist, перенаправив ее вывод в файл, C: \ blah> tasklist> aa, затем откройте файл aa, вы увидите итоги для каждого процесса, например, 15 100 К, удалите K после них и сложите итоги в Excel. Посмотрите, соответствует ли итоговое значение использованной цифре, которую диспетчер задач дает вам рядом с графиком использованных. Для меня общий объем из списка задач составляет 4 ГБ, а диспетчер задач говорит о 4,5 ГБ. Я не могу объяснить расхождение, которое у меня есть, но оно невелико. было бы интересно, если бы у вас было огромное расхождение.
Бароп

У меня нет Excel
Вейдер

1
Теги NDxx - это ndis.sys. Я предполагаю, что BRCM был Broadcom. Это указывает на проблему с вашим сетевым адаптером.
Дэвид Маршалл,

Ответы:


82

У вас есть утечка памяти, вызванная драйвером. Посмотрите на высокое значение памяти невыгружаемого ядра. В вашем случае это более 3,7 ГБ. Вы можете использовать poolmon, чтобы увидеть, какой драйвер вызывает высокую загрузку .

Установите Windows WDK , запустите poolmon, отсортируйте его по Pтипу пула, чтобы не выгружаемый был сверху, а Bпосле байтов - чтобы увидеть тег, который использует больше памяти. Запустите poolmon, перейдя в папку, где установлен WDK, перейдите в Инструменты (или C: \ Program Files (x86) \ Windows Kits \ 10 \ Tools \ x64) и нажмите poolmon.exe.

Теперь посмотрите, какой тэг пула использует больше всего памяти, как показано здесь:

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

Теперь откройте командную строку и запустите команду findstr. Для этого откройте командную строку и введите «cd C: \ Windows \ System32 \ drivers» без кавычек. Затем введите «findstr / s __ . », Где __ - это тег (самое левое имя в poolmon). Сделайте это, чтобы увидеть, какой драйвер использует этот тег:

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

Теперь перейдите в папку драйверов (C: \ Windows \ System32 \ drivers) и щелкните правой кнопкой мыши нужный драйвер (intmsd.sys в приведенном выше примере изображения). Нажмите Свойства, перейдите на вкладку сведений, чтобы найти название продукта. Ищите обновление для этого продукта.

Если тег пула показывает только драйверы Windows или указан в файле pooltag.txt ( "C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x64\triage\pooltag.txt")

Вы должны использовать xperf, чтобы отследить, что вызывает использование . Установите WPT из Windows SDK , откройте cmd.exe от имени администратора и выполните следующее:

xperf -on PROC_THREAD + LOADER + POOL -stackwalk PoolAlloc + PoolFree + PoolAllocSession + PoolFreeSession -BufferSize 2048 -MaxFile 1024 -FileMode Circular && timeout -1 && xperf -d C: \ pool.etl

захватить 30 -60-х годов роста. Откройте ETL с помощью WPA.exe, добавьте графики пула на панель анализа.

Поместите столбец пула тегов на первое место и добавьте столбец стека. Теперь загрузите символы в WPA.exe и разверните стек тега, который вы видели в poolmon.

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

Теперь найдите другие сторонние драйверы, которые вы можете увидеть в стеке. Здесь Threтэг (Thread) используется AVKCl.exe из G-Data. Ищите обновления драйверов / программ, чтобы исправить это.


1
ой, извини. @Jebediah Керман, ты выполнил команду findstr? Из названия это может быть связано с драйвером сетевой карты. Если у вас все еще есть проблемы, запустите RAMMap, сохраните данные как RMP, сожмите файл RMP и загрузите zip.
magicandre1981

это может звучать глупо. Но как мне запустить poolmon. Я имел обыкновение искать "poolmon.exe" и запускать
Vader

@JebediahKerman Я думаю, вы уже сделали это и нашли теги. Разве картинка из твоего поста не твой пулмон?
magicandre1981

Картина моя. По какой-то причине поисковый индекс был неполным.
Вейдер

@JebediahKerman ты смотрел, что это за NDFT? Кроме того, можно использовать Xperf отслеживать использование бассейна: channel9.msdn.com/Shows/Defrag-Tools/...
magicandre1981

15

Ну, во-первых, прежде чем перейти к более подробному ответу. На первом снимке экрана размер пула без пейджинга (тип использования памяти ядра) составляет 1,3 ГБ. Это кажется необычно высоким, особенно в течение 30 минут после загрузки. Я думаю, я мог видеть, как NP Pool достигает такого высокого уровня после длительного использования или с программой, которая просачивалась как сито. В отличие от этого, мой пул NP обычно составляет от 100 до 200 мегабайт, а размер моего выгружаемого пула может достигать 400 или 500 (и это после того, как моя система работает без перезагрузки в течение нескольких недель).


Вы можете включить несколько дополнительных столбцов в диспетчере задач, щелкнув правой кнопкой мыши заголовки столбцов и выбрав выбрать столбцы. Следует добавить Working Set (private), Working Set (shared), Commit, и NP Pool. Я просканировал бы все ваши процессы от всех пользователей и увидел бы, есть ли у какого-либо из них пул NP более 256 КБ. Если вы видите какую-либо, особенно любую, которая значительно выше, это может быть источником проблемы или, по крайней мере, ее частью.

Ваш общий рабочий набор, объем физической памяти, используемой процессом, представляет собой комбинацию частного и общего рабочих наборов (WS). Private обычно больше для большинства процессов, но могут быть и такие, которые используют большее количество общих WS. Эти два, как правило, должны составлять общую сумму WS. Фиксация - это количество вашего рабочего набора, которое было передано в резервное хранилище (в большинстве случаев это файл подкачки Windows). Фоновые приложения часто имеют более высокий уровень Commit, чем WS, что указывает на то, что большая часть их выгружаемого пула была выгружена из памяти в файл подкачки (что вполне нормально для приложений для настольных компьютеров, которые были свернуты и некоторое время не использовались).

Non-Paged Pool - это память, которая не может и никогда не будет выгружена из физической памяти ... что фактически является вашим постоянным минимальным использованием физической памяти. Память NP Pool часто содержит программный код и критические разделы, которые должны находиться в физической памяти для правильного и безопасного поведения, специальные кучи и т. Д. Из 60 процессов, если все они имеют 256 КБ памяти NP Pool, тогда ваш абсолютный минимум использования физической памяти будет около 15 360 КБ. В большинстве случаев одно или два приложения могут иметь пул NP размером 256 КБ, в то время как в большинстве приложений их меньше, часто значительно меньше (или их нет). Крайне маловероятно, что система когда-либо выгрузит все рабочие процессы, поэтому не ожидайте, что использование памяти достигнет такого низкого уровня.


Наконец, смысл в том, чтобы иметь больше памяти, чтобы избежать необходимости перелистывать данные в расширенное пространство памяти (файл подкачки, файл подкачки) и из него на физическом диске. Пейджинг - это процесс, который включает перемещение блоков выделенной физической памяти, выталкивание одних на диск и перенос других в физическую память с диска. Пейджинг, чтобы быть простым, крайне нежелателен. Само по себе это не «плохо», но это может сильно снизить производительность, если это происходит слишком часто. Конечная точка увеличения общего физического ОЗУ в системе - позволить большему количеству процессов хранить больше своей фиксации в физической памяти (больший рабочий набор). Потребление памяти не является проблемой, и когда больше выполняющихся процессов используют больше памяти, общая производительность системы и производительность активных процессов обычно будут выше,

Windows управляет памятью для вас и автоматически подготавливает данные в и из памяти для вас и из файла подкачки. Если вы запускаете процесс, которому требуется 9 ГБ памяти, а ваша система уже использует 4 ГБ (из 12 ГБ), то система автоматически определит, каким процессам не требуется немедленный доступ ко всему их рабочему набору, и отобразит некоторые или все страницы. их выгружаемого пула, чтобы обменять их, чтобы освободить лишние 1 ГБ. Если вашему большому процессу в конечном итоге потребуется больше памяти, окна будут дополнительно сокращать рабочий набор других процессов, пока у него не будет достаточно свободного места для выделения нового запрошенного блока. Ваш большой процесс может в конечном итоге потреблять всю доступную память, кроме NP Pool и, возможно, некоторые дополнительные минимальные накладные расходы для периодически выполняющихся процессов, которые не позволяют Windows высвободить больше своего рабочего набора (т.е. е. у них есть ожидающие ошибки страницы, которые в противном случае Windows вывела бы из физической памяти, но, поскольку они запрашиваются, они не могут быть перемещены.)

Если процессу требуется больше памяти, чем ему разрешено (32-разрядные процессы обычно могут получить доступ к 2 ГБ, а некоторые чуть менее 4 ГБ с расширенными методами, в то время как 64-разрядные процессы обычно могут получать доступ к около 48 ГБ памяти каждый), тогда окна иногда пытаются виртуализировать свою память с пространством подкачки. Если 32-разрядное приложение хочет использовать максимально допустимое пространство 2 ГБ, но доступно только 1,2 ГБ, Windows зарезервирует все 2 ГБ в файле подкачки и перемещает собственные данные процессов в файл подкачки и из него по мере необходимости, чтобы Поддержка использования памяти приложения. Общее использование «памяти» в этом случае может оказаться больше, чем доступная физическая память, если использовать Total Commit. Обычно Total Commit будет максимально равен общему размеру файла подкачки, который при управлении системой обычно в 2-3 раза больше объема физической памяти. В твоем случае,


Один последний момент. В своем ответе вы сказали, что у вас 16 ГБ ОЗУ, тогда как диспетчер задач видит только 12 ГБ ОЗУ. Одна из двух вещей здесь. Либо ваша система действительно имеет только 12 ГБ ОЗУ, либо одна из ваших флешек не регистрируется должным образом. Если флешка (я предполагаю, что 4x 4 Гб флешки), это может быть плохо, может быть не совсем правильно сидит на вашей материнской плате, или ваша материнская плата может иметь проблемы с обнаружением памяти.

Чтобы проверить, является ли это последним, вы должны сначала обновить BIOS материнской платы до последней версии. У меня была похожая проблема ... мои шесть трёхканальных DDR3-флешек оперативной памяти (6x2 Гб) были хорошими, основываясь на индивидуальном тестировании каждого из них ... но моя материнская плата случайно решила не считать один или два из них время от времени, часто оставляя мне только 8 ГБ оперативной памяти. Обновление BIOS устранило проблему, и теперь у меня есть надежный доступ ко всем 12 ГБ памяти.


интересно ... и я только что заметил, что его невыгружаемая память очень велика .. моя страница 539 МБ, 139 МБ. Не ясно. Я знаю об этом больше, чем я. Но вы не правы в общем коммите. напишите «Total Commit будет обычно максимально использовать общий размер файла подкачки». Объем моей оперативной памяти составляет 12 ГБ. Я установил для файла подкачки минимум 4000 МБ (3,8 ГБ?) и 1,5-2x памяти как максимальный. Максимальный размер моего коммита составляет 15 ГБ (commit = 7 / 15 в настоящее время), мой файл подкачки имеет размер около 4 ГБ или, вероятно, немного меньше, чем 3.8 ГБ. Макс. Коммит больше похож на размер файла подкачки + объем ОЗУ. Когда мой файл подкачки был 12 ГБ, мой максимальный размер был около 24 ГБ. Pagefile почти 3,8 ГБ или 4 ГБ максимальный коммит составляет 15
ГБ

@ barlop: Ну, вы несколько неправильно понимаете, что такое коммит. С технической точки зрения, плата за фиксацию - это общее «виртуально адресуемое пространство памяти», включая пространство, поддерживаемое расширенными менеджерами памяти, и возможность распознавания больших адресов. Максимальная фиксация не будет файлом подкачки + ОЗУ, скорее, она будет описана как общее виртуальное адресное пространство, управляемое системой. Файл подкачки должен, как правило, охватывать, по крайней мере, общий объем физической памяти и дополнительно расширять его за пределы общего объема физической памяти. В вашем случае я бы ожидал, что коммит будет по крайней мере 18 ГБ (1,5x) или 24 ГБ (2x), однако это ...
jrista

... будет иметь место для системного файла подкачки. Похоже, вы вручную подправили настройки вашего файла подкачки, и в этом случае мне нужно было бы узнать больше о вашей конкретной конфигурации, чтобы сказать вам, почему ваш текущий коммит составляет 15 ГБ (так как файл подкачки 3.8 / 4 ГБ будет указывать на фиксацию 16 ГБ, а не 15 ГБ) .) Вполне возможно вручную настроить не файл подкачки или файл подкачки, который слишком мал, что может привести к странным проблемам с производительностью и распределением памяти. Лучшая рекомендация, если у вас нет специфической настройки сервера (т.е. базы данных), - разрешить Windows управлять своим файлом подкачки.
Ириса

Последнее замечание Для максимальной производительности лучше всего, чтобы окна заранее выделяли максимальный размер файла подкачки. Обычно это делается на настройках сервера, таких как база данных SQL Server, где вы можете предварительно выделить 64 ГБ или более (обычно в 2 раза больше физического ОЗУ, так что, возможно, даже 128 ГБ или 256 ГБ) в файл подкачки, который равномерно распределен между несколькими физическими дисками для максимальной производительности. , Распределенные файлы подкачки, особенно когда они предварительно распределены до максимального размера, позволяют чередовать чтение / запись на всех участвующих дисках, что позволяет повысить производительность подкачки через параллельный ввод-вывод.
Ириса

В качестве примера большой нагрузки на память моя система в настоящее время использует: 7,5 / 12 ГБ физической памяти; 14.7 / 23.3Gb commit; 491mb выгружаемый пул; Бассейн 145мб нп. Это для 146 процессов, максимальный выгружаемый пул 2276k, максимальный np пул 263k. Максимальный размер коммита 696 396 Кб, а для того же процесса WS - 714 256 Кб (процесс вкладки Opera.) (Мое большое количество процессов связано с веб-браузером ... сегодня они изолируют вкладки с помощью процесса, а я гипертаббер ... десятки открытых сразу, поэтому десятки дополнительных процессов).
jrista

12

Как я могу узнать, почему моя Windows использует так много оперативной памяти.

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

Если вы думаете: «Я хочу, чтобы моя оперативная память была свободной, чтобы я мог использовать ее позже», забудьте об этом. Оперативная память не должна быть свободной сейчас, чтобы использовать ее позже. Вы можете использовать его сейчас и использовать его позже. Здесь нет компромисса - нет абсолютно никаких недостатков в использовании оперативной памяти.

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


12
Если моя система Windows7 использует 3 ГБ оперативной памяти при запуске без открытых приложений, что-то должно быть не так
Vader

5
@JebediahKerman Почему ты так говоришь? Я приложил некоторые усилия, чтобы попытаться объяснить вам, почему это не так и почему Windows предназначена для этого. Вы не поняли моего объяснения? Или, если вы не согласны с этим, не могли бы вы объяснить, где вы думаете, что я не прав?
Дэвид Шварц

11
@DavidSchwartz совершенно неверный ответ. У него утечка памяти у водителя
magicandre1981

9
@DavidSchwartz: описываемое вами поведение (выделение ОЗУ, которое можно использовать повторно) обязательно должно выполняться из памяти с возможностью постраничного вывода. Вызывает беспокойство цифра 1,3 ГБ нестраиваемой памяти. Вы не можете просто освободить это для других ресурсов, куда эти 1,3 Гбайт будут уходить? Быть «невыгруженным» означает, что владелец сказал, что «эти байты настолько важны, что вы даже не можете поместить их на диск, не говоря уже об их отбрасывании».
MSalters

25
Почему этот «ответ» проголосовал так высоко? Это полностью упускает суть. Независимо от конкретных используемых слов (которые были совершенно ясны с самого начала), вопрос не в этом “Why is Windows using RAM?”, вопрос в том, что “Why do the RAM usage numbers not add up; why is one part reporting a higher usage than another part?”этот пост должен быть в лучшем случае комментарием, потому что он не затрагивает реальный вопрос или даже не пытается на него ответить; это лишь небольшой совет, и плохой совет, поскольку, если бы ОП проигнорировал его, как предполагалось, утечка памяти не была бы обнаружена.
Synetech

2

Причиной, не упомянутой выше, является Hyper-V.

Мне удалось идентифицировать это с отличной утилитой RamMap :

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

Скриншот от после. До того, как объем памяти «Driver Locked» превышал 6 ГБ, на этой конкретной машине было более 80% ОЗУ. Мне пришлось зайти в диспетчер Hyper-V и отключить «Динамическую память». Любопытно, что даже после его повторного включения память «Driver Locked» оставалась низкой - я могу только предположить, что предыдущие экземпляры увеличивали ее, и что Hyper-V автоматически не уменьшает выделенную память:

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.