66

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

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


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


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

4 ответа4

77

У вас есть утечка памяти, вызванная драйвером. Посмотрите на высокое значение памяти невыгружаемого ядра. В вашем случае это более 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, добавьте графики пула на панель анализа.

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

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

14

Ну, во-первых, прежде чем перейти к более подробному ответу. На первом снимке экрана размер пула без подкачки (тип использования памяти ядра) составляет 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, и, возможно, некоторые дополнительные минимальные накладные расходы для периодически выполняющихся процессов, которые не позволяют Windows высвобождать больше своего рабочего набора (т. Е. Они имеют ожидающие сбои страниц, из-за которых Windows в противном случае могла бы выгрузиться физической памяти, но поскольку они запрашиваются, они не могут быть перемещены.)

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


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

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

12

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

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

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

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

0

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

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

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

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