Dlaczego całkowite użycie pamięci RAM i Menedżera zadań nawet zdalnie nie sumuje się z całkowitym zużyciem pamięci fizycznej? [duplikować]


30

Zauważyłem to na wielu różnych komputerach z systemem Windows, przy różnych okazjach: użycie pamięci RAM zgłaszane przez Menedżera zadań lub Monitor zasobów często wydaje się sumować do kwoty znacznie niższej niż rzeczywista używana.

Na przykład wiele razy na moim laptopie lub komputerze stacjonarnym widziałem coś w rodzaju 7 GB w użyciu, a mimo to suma roboczego zestawu pamięci RAM jest bardziej jak 3 GB. Po prostu nie mogę zrozumieć, gdzie jest używany!

Oto skrajny przykład, który zauważyłem dzisiaj w Monitorze zasobów na serwerze:

Monitor zasobów
Kliknij, aby zobaczyć pełny rozmiar

Jeśli klikniesz obraz prawym przyciskiem myszy, otworzysz nową kartę i wyświetlisz liczby, zauważysz, że Zestaw roboczy (który nie zawiera niefizycznej pamięci wirtualnej) stanowi około 1,7 GB. Otrzymuję podobne liczby, sumując użycie pamięci RAM w Menedżerze zadań, gdy włączone jest „Pokaż procesy od wszystkich użytkowników”.

Oto zrzut ekranu karty Wydajność menedżera zadań:

Menadżer zadań
Kliknij, aby zobaczyć pełny rozmiar

Oznacza to, że użyto 7,6 GB pamięci fizycznej.

Cały czas to widzę, na komputerach osobistych, laptopach, a teraz na serwerach: całkowite użycie pamięci RAM zgłoszone przez narzędzia systemowe stanowi tylko około 1/4 zużycia pamięci RAM, które obserwuję. Co się do cholery dzieje???

Czy jest jakieś satysfakcjonujące wyjaśnienie, gdzie jest cała moja pamięć RAM? Co to pochłania i dlaczego nie pozostawia śladu?

EDYCJA: Oto obraz wykorzystania graficznej pamięci RAM, o co poprosił użytkownik:

Wykorzystanie RamMap
Kliknij, aby zobaczyć pełny rozmiar

EDYCJA 2: W odpowiedzi na odpowiedź Jamesa, oto obraz niestronicowanych procesów poolmon.exe, posortowany według wielkości:

wprowadź opis zdjęcia tutaj

Te wyniki mnie mylą. poolmonpoprawnie stwierdza, że ​​mam 6 GB puli niestronicowanej, ale wszystkie procesy puli niestronicowanej mają rozmiar mniejszy niż 8 MB.

Co to może znaczyć? Czy poolmonnie można wykryć niektórych procesów korzystających z puli niestronicowanej?



Czy możesz zamieścić zdjęcie monitora zasobów> zakładka Pamięć (tylko dolna część z kolorami i liczbami). To by było bardziej wymowne.
whs

2
@Ramhound: Dziękujemy za wskazanie mi tego linku! Niestety, zgodnie z prośbą, przesłałem zdjęcie mapy graficznej pamięci fizycznej Monitora zasobów, a część pamięci fizycznej w trybie gotowości jest mniejsza niż 2% całkowitego wykorzystania pamięci RAM. Odpowiedź Davida Schwartza sugeruje, że użycie „ukrytej” pamięci RAM pochodzi z rezerwowej pamięci RAM (tj. Pamięci RAM używanej do buforowania danych i kodu nieużywanego), i nie ma to miejsca w tym przypadku. W związku z tym nie sądzę, aby odpowiedź Davida wyjaśniała, co się dzieje.
DumpsterDoofus

Skorzystaj z programu RamMap i odkrywaj z nim więcej., Do tej pory może to być jakiś szaleństwo kierowcy? ale w rzeczywistości nie jest to tryb gotowości (pamięć podręczna). Czy uruchamiasz jakieś specjalne programy, które mają na celu naprawienie pamięci RAM, lub które mają przyspieszyć komputer? Jakieś dziwne elementy sterownika, które byłyby specjalne dla twoich komputerów?
Psycogeek

2
Link do „odpowiedziano wcześniej” nie obejmuje tej sprawy.
Jamie Hanrahan,

Odpowiedzi:


30

Przepraszam, wiem, że to brzmi jak nonszalancka odpowiedź ... ale odpowiedź na pytanie w twoim tytule brzmi „ponieważ nie powinny”.

Lub mówiąc grzeczniej: dużo pamięci RAM nie wykorzystuje się w prywatnych zestawach roboczych procesów. Niektóre z nich znajdują się we współużytkowanych zestawach roboczych procesów - ale nie można uzyskać wiarygodnego wyobrażenia o faktycznym wykorzystaniu tam z powodu udostępniania; zsumowanie liczb procesów da zdecydowanie zbyt duży wynik.

Inne rzeczy, które zajmują pamięć RAM, takie jak pula niestronicowana, część rezydentna puli stronicowanej i części rezydentne innych zastosowań przestrzeni jądra, w ogóle nie pojawiają się na ekranie „procesów” Menedżera zadań.

Jeśli chodzi o konkretny problem:

Na ekranie Menedżera zadań zobacz sekcję „Pamięć jądra”? Masz 6 GB „niestronicowanej pamięci” (to pula niestronicowana). To część sekcji „W użyciu” na drugim wykresie. Pula niestronicowana nie jest obciążana żadnym procesem, dlatego sumowanie liczb dla poszczególnych procesów w menedżerze zadań nie zbliża się do całkowitej używanej sumy. Niektóre sterowniki najprawdopodobniej go używają. Jest to całkowicie nadmierna kwota; powinno być znacznie poniżej 1 GB. jakikolwiek sterownik odpowiedzialny za nadmierną część korzystania z puli niestronicowanej jest bez wątpienia błędny.

RAMmap może to potwierdzić (na karcie „Liczniki użycia”, spójrz na sumę „Pula niestronicowana”), ale nie może pomóc w ustaleniu, który sterownik to powoduje.

Oto, jak go znaleźć: Uzyskaj kopię narzędzia Microsoft „poolmon”. Jest to narzędzie w trybie znakowym (chłopiec, czy kiedykolwiek tak jest) rozpowszechniane z zestawem sterowników systemu Windows. W przypadku systemu Windows 7 WDK jest do pobrania za darmo . Musisz pobrać całość (ISO) i zainstalować ją z tego, ale możesz wybrać instalację tylko narzędzi, jeśli to wszystko, czego chcesz.

Znajdź poolmon w katalogach WDK - pamiętaj, aby wybrać właściwy, 32- lub 64-bitowy - i uruchom go z wiersza polecenia administratora. Otrzymasz taki ekran:

wprowadź opis zdjęcia tutaj

Teraz naciśnij klawisz „p” (nie, nie żartuję. Nie ma tutaj menu!), Dopóki kolumna „Typ” pokaże tylko „Nonp”. Następnie naciśnij „b” (dwa razy, jeśli to konieczne), aby posortować wyświetlacz w kolejności malejącej według kolumny Bajty (tak jak to już tutaj zrobiono w przykładzie).

Następnie spójrz na kolumnę „Tag” dla najwyższego wiersza. W pokazanym tutaj (oczywiście sztucznym) przypadku jest to „wyciek”. (W tym systemie jest uruchomiony sterownik, który został celowo zepsuty, aby spowodować ten problem - to „nieszczelna” pula niestronicowana).

btw, podświetlone linie to te, które zmieniły się od czasu poprzedniej aktualizacji tego archaicznego ekranu.

Teraz wyszukaj c: \ Windows \ System32 \ Drivers w poszukiwaniu pliku .sys zawierającego ten ciąg. W takim przypadku będziesz szukać „Przeciek”, jak poniżej:

c:\windows\system32> findstr /s Leak *.sys

Następnie wyszukaj w Internecie odniesienia do tego ciągu i / lub nazwy sterownika.

Pomocny byłby również powrót tutaj i zgłoszenie pełnej nazwy, nazwy producenta itp. Z pliku .sys.

(Założę się, że tag, który znajdziesz, to ECMC, sterownik to intmsd.sys i jest on powiązany z produktem o nazwie ExpressCache lub IntelliMemory. Chciałbym „odinstalować” ten produkt. Jest aktualizacja, aby rozwiązać problem, ale nawet ze stałą wersją nigdy nie widziałem poprawy wydajności systemu przez ten produkt; zasadniczo powiela on funkcje, które są już w systemie Windows).

Jeśli nie możesz go znaleźć w ten sposób, następnym krokiem jest skorzystanie z „Zestawu narzędzi wydajności systemu Windows”. Przeszukaj to forum w poszukiwaniu tego ciągu, z odpowiedziami od magicandre1981, aby uzyskać instrukcje. Zignoruj ​​odpowiedzi, które wspominają o xperf - jest to starsza wersja narzędzia.

AKTUALIZACJA: Zgodnie z komentarzami PO dokonał powyższego i stwierdził, że chociaż poolmon zgłosił, że całkowity rozmiar puli niestronicowanej był rzeczywiście ogromny, wszystkie przydzielone elementy były najwyraźniej małe. Moja hipoteza (także w komentarzach) jest taka, że ​​wynika to z tego, co nazywam pulą „rozdętą”: Pula została przydzielona, ​​a następnie zwolniona, ale z jakiegoś powodu ilość pamięci RAM przydzielonej do puli nie została zmniejszona, aby odzwierciedlić „uwolnienie” . Postępując zgodnie z procedurą opisaną w tej odpowiedzi przez magicandre, można zidentyfikować winowajcę.


Dziękujemy za podjęcie dalszych badań niż inni! Będę rozglądać się za wyciekiem, używając poolmondzisiaj, jeśli będę miał czas, i spróbuję przeczytać twoją odpowiedź również uważniej, aby upewnić się, że ją rozumiem. Mówisz, że prawdopodobnie wyciek pamięci? Jeśli tak, jest to całkowicie prawdopodobne, ponieważ pracujemy nad oprogramowaniem znanym z okropnych wycieków pamięci.
DumpsterDoofus

@DumpsterDoofus: Tak. Prawdopodobnie występuje wyciek pamięci w sterowniku trybu jądra. Różni się to od wycieku pamięci w aplikacji.
Jamie Hanrahan

W końcu zacząłem działać poolmon.exena danym serwerze i zredagowałem moje pytanie, aby dołączyć zrzut ekranu. poolmonstwierdza, że ​​mam pulę niestronicowaną o wielkości 6 GB (jak wskazałeś na moim zrzucie ekranu Menedżera zadań), ale kiedy patrzę tylko na procesy „Nonp” i sortuję według rozmiaru, wszystkie są małe (największa to 8 MB). Czy masz jakieś pomysły, dlaczego poolmonnie wykrywasz dużej części puli niestronicowanej?
DumpsterDoofus,

2
Ach ... problemem jest tutaj słowo „użycie”. Masz więc pulę niestronicowaną o wielkości 6 GB, ale wygląda na to, że tylko niewielka jej część jest obecnie używana. Niestety nic, o czym wiem (nie TM, nie poolmon, nie RAMmap) nie pokazuje, ile puli faktycznie jest w użyciu. Domyślam się, że kiedyś był duży użytkownik puli, więc pula została rozbudowana, aby ją pomieścić, a potem ciężki użytkownik odszedł. Ze względu na sposób, w jaki pula jest obsługiwana, zwolnienie pamięci RAM po przydzieleniu jej nie jest łatwe, chyba że alokacja składała się z dużych, ciągłych porcji. Sugeruję obejrzenie tego po ponownym uruchomieniu systemu.
Jamie Hanrahan,

Dostępna jest wersja poolmon.exe w Narzędziach pomocy technicznej dla Server 2003 ( serverfault.com/questions/84479 / ... ) - nieco stara, ale pobiera zaledwie 5,2 MB i nadal działa (przynajmniej) na serwerze 2016.
mwfearnley
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.