Чому монітор ресурсів та загальне використання оперативної пам’яті диспетчера завдань навіть віддалено не складають загальне використання фізичної пам’яті? [дублікат]


30

Я помічав це на багатьох різних машинах Windows, у багатьох випадках: використання оперативної пам’яті, повідомлене менеджером завдань або Монітором ресурсів, часто здається, що вона дорівнює значно більшій кількості, ніж фактична кількість.

Наприклад, багато разів на своєму ноутбуці чи на робочому столі я бачив щось на зразок 7 Гб, але загальний набір робочої оперативної пам’яті більше схожий на 3 Гб. Я просто не можу зрозуміти, де це використовується!

Ось надзвичайний приклад, який я сьогодні помітив у Resource Monitor на сервері:

Монітор ресурсів
Клацніть для повного розміру

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

Тепер ось скріншот вкладки «Продуктивність менеджера завдань»:

Менеджер завдань
Клацніть для повного розміру

Це говорить про використання 7,6 Гб фізичної пам'яті.

Я це бачу весь час на персональних комп’ютерах, ноутбуках і тепер серверах: загальне використання оперативної пам’яті, повідомлене системними інструментами, складає близько 1/4 спостереження, яке я спостерігаю. WTF продовжується ???

Чи є якесь задовольняюче пояснення, де знаходиться вся моя оперативна пам'ять? Що це збиває, і чому це не залишає слідів?

EDIT: Ось малюнок використання графічної оперативної пам’яті, коли користувачі просили:

Використання RamMap
Клацніть для повного розміру

EDIT 2: У відповідь на відповідь Джеймса, ось малюнок незапартованих процесів у poolmon.exe, відсортований за розміром:

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

Ці результати мене бентежать. poolmonправильно зазначається, що у мене є 6 Гб неопакованого пулу у використанні, але всі процеси, що не підключаються під тиском, мають розмір менше 8 МБ.

Що це могло означати? Є чи poolmonне виявлення деякі з процесів , що використовують неподкачіваемий басейн?



Чи можете ви опублікувати зображення вашого монітора ресурсів> вкладки «Пам'ять» (лише нижня частина з кольорами та цифрами). Це було б більш показовим.
пн

2
@Ramhound: Дякую, що ти вказав на це посилання! На жаль, як тільки що просили, я завантажив зображення графічної карти фізичної пам'яті Resource Monitor, а частина очікування фізичної пам'яті становить менше 2% від загального обсягу використання оперативної пам'яті. Відповідь Девіда Шварца говорить про те, що "приховане" використання оперативної пам'яті відбувається з резервної оперативної пам'яті (тобто, оперативної пам'яті, що використовується для кешованих даних і коду, які не використовуються), і це не так. Тому я не думаю, що відповідь Девіда пояснює, що відбувається.
DumpsterDoofus

Скористайтеся програмою RamMap і вивчіть її більше. але насправді це не очікування (кеш). Ви запускаєте якісь спеціальні програми, які дозволяють виправити оперативної пам'яті, або які, припустимо, пришвидшити комп'ютер? Якісь дивні елементи драйвера, які були б особливими для ваших комп'ютерів?
Psycogeek

2
Посилання на "відповів раніше" не стосується цієї справи.
Джеймі Ханрахан

Відповіді:


30

Вибачте, я знаю, що це звучить як нескінченна відповідь ... але відповідь на запитання у вашому заголовку "тому, що вони цього не повинні".

Або, якщо говорити більш ввічливо: Є багато оперативної пам’яті, якої немає в приватних робочих наборах процесів. Деякі з них є у спільних робочих наборах процесів - але ви не можете отримати надійне уявлення про фактичне використання там через обмін; додавання чисел процесів дасть дуже великий результат.

Інші речі, які займають оперативну пам’ять, як-от непарний пул, резидентна частина підкаченого пулу та резидентні частини інших використань простору ядра, взагалі не відображаються в "процесах" диспетчера задач диспетчера.

Щодо конкретного питання:

На дисплеї диспетчера завдань див. Розділ «Пам'ять ядра»? У вас є 6 Гб "непарної пам'яті" (це непарний пул). Це частина розділу "Використовується" у вашому другому графіку. Незапаркований пул не стягується жодним процесом, через що додавання номерів за кожним процесом у диспетчері завдань не наближається до загальної кількості, що використовується. Деякий драйвер, швидше за все, ним користується. Це повністю надмірна кількість; він повинен бути набагато менше 1 ГБ. будь-який драйвер несе відповідальність за надмірну частину використання басейну, що не використовується, не викликає сумнівів.

RAMmap може підтвердити це (на вкладці "Використовувати підрахунки", подивитись на загальну суму для "Непропонованого басейну"), але він не може допомогти вам знайти, який драйвер викликає це.

Ось як його знайти: Отримайте копію інструменту Microsoft "poolmon". Це інструмент в режимі символів (хлопчик, це коли-небудь), що поширюється разом із комплектом драйверів Windows. Для Windows 7 WDK - це безкоштовно завантажити . Вам потрібно завантажити всю річ (це ISO) та встановити її з цього, але ви можете встановити лише інструменти, якщо це все, що вам потрібно.

Знайдіть пуллони в каталогах WDK - обов’язково виберіть потрібний, 32- або 64-розрядний - та запустіть його з командної лінії адміністратора. Ви отримаєте такий показ:

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

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

Потім подивіться на стовпчик "Тег" для верхнього рядка. У (очевидно штучному) випадку, показаному тут, це "Витік". (У цій системі працює драйвер, який був навмисно помилок, щоб викликати цю проблему - це "протікання" непарного пулу.)

btw, виділені лінії - це ті, що змінилися з попереднього оновлення на цей архаїчний екран.

Тепер знайдіть 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сьогодні, якщо матиму час, і спробую детальніше прочитати вашу відповідь, щоб переконатися, що я її розумію. Ви кажете, що, мабуть, є витік пам'яті? Якщо це так, це цілком правдоподібно, оскільки ми працюємо над програмним забезпеченням, яке, як відомо, має деякі жахливі витоки пам'яті.
DumpsterDoofus

@DumpsterDoofus: Так. Ймовірно, витік пам'яті в драйвері режиму ядра. Це відрізняється від витоку пам'яті в додатку.
Джеймі Ханрахан

Тож я нарешті почав працювати poolmon.exeна розглянутому сервері і відредагував своє запитання, щоб включити скріншот. poolmonзаявляє, що у мене є 6-Гбайтний непарний пул (як ви вказали з мого скріншоту диспетчера завдань), але коли я дивлюся лише на "Nonp" процеси та сортую за розміром, вони всі крихітні (найбільший - 8 МБ). Чи є у вас ідеї, чому б poolmonне виявити основну частину використання непарного пулу?
DumpsterDoofus

2
Ага ... проблема тут полягає у слові "використання". Отже, у вас є 6 Гб непропонованого басейну, але, здається, наразі використовується лише його частина. На жаль, нічого, про що я знаю (не TM, не poolmon, не RAMmap), показує, яка частина пулу насправді використовується. Я здогадуюсь, що свого часу був важкий користувач басейну, тому басейн розширили для його розміщення, а потім важкий користувач пішов. Завдяки тому, як обробляється пул, непросто звільнити оперативну пам’ять, коли вона була виділена, якщо тільки розподіл не було великими суміжними шматками. Я б запропонував переглянути це після нового запуску системи.
Джеймі Ханрахан

Існує версія poolmon.exe, доступна в Інструментах підтримки для сервера 2003 ( serverfault.com/questions/84479/… ) - трохи старої, але вона завантажена лише 5,2 МБ і все ще працює на (принаймні) Server 2016.
mwfearnley
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.