2013-11-12 01:10:06 +0000 2013-11-12 01:10:06 +0000
75
75

Windows używa zbyt dużo pamięci RAM, jak zdiagnozować problem z zasobami

Mam 16GB systemowej pamięci RAM. Podczas uruchamiania, gdy nie mam otwartych żadnych aplikacji poza task-managerem, Windows zużywa około 3gb pamięci RAM. Sprawdzałem w zakładce procesy, ale nic nie wygląda na nic nadzwyczajnego. Jak mogę się dowiedzieć, dlaczego mój Windows zużywa tak dużo RAM.

wszystkie procesy od wszystkich użytkowników


Czytając z poolmona wygląda na to, że mój sterownik bezprzewodowy Broadcom zużywa około 0,4GB pamięci RAM. Nawet gdybym go usunął, nadal zużywałby 2,6GB podczas uruchamiania, co wciąż jest za dużo.


Po ponownym zainstalowaniu sterownika bezprzewodowego związanego z wyciekiem pamięci. Mam nowy zrzut ekranu i chciałbym potwierdzić, że rzeczywiście był to wyciek pamięci.

Odpowiedzi (4)

85
85
85
2013-11-12 04:54:18 +0000

Masz wyciek pamięci spowodowany przez sterownik. Spójrz na wysoką wartość niestronicowanej pamięci jądra. W twoim przypadku jest to ponad 3.7 GB. Możesz użyć poolmon aby zobaczyć, który sterownik powoduje wysokie użycie.

Zainstaluj Windows WDK , uruchom poolmon, posortuj go przez P po typie puli tak, aby niestronicowana była na górze i przez B po bajtach, aby zobaczyć tag, który używa najwięcej pamięci. Uruchom poolmon przechodząc do folderu, w którym zainstalowany jest WDK, przejdź do Tools (lub C:™Program Files (x86)™Windows Kits (x86)™Tools (x64) i kliknij poolmon.exe.

Teraz sprawdź, który pooltag zużywa najwięcej pamięci, jak pokazano tutaj:

Teraz otwórz cmd prompt i uruchom polecenie findstr. Aby to zrobić, otwórz cmd prompt i wpisz “cd C:\Windows\System32\drivers”, bez cudzysłowów. Następnie wpisz “findstr /s \_ .”, gdzie __ jest tagiem (lewa skrajna nazwa w poolmon). Zrób to, aby zobaczyć, który sterownik używa tego tagu:

Teraz przejdź do folderu sterowników (C:\Windows\System32\drivers) i kliknij prawym przyciskiem myszy dany sterownik (intmsd.sys w powyższym przykładzie graficznym). Kliknij przycisk Właściwości, przejdź do zakładki Szczegóły, aby znaleźć Nazwę produktu. Poszukaj aktualizacji dla tego produktu.

Jeśli pooltag pokazuje tylko sterowniki Windows lub jest wymieniony w pooltag.txt ("C:\Program Files (x86)\Windows Kits.1\Debuggers\x64\triage\pooltag.txt")

musisz użyć xperf, aby wyśledzić co powoduje użycie . Zainstaluj WPT z Windows SDK , otwórz cmd.exe jako administrator i uruchom to:

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

przechwyć 30 -60s przyrostu. Otwórz ETL za pomocą WPA.exe, dodaj wykresy Pool do panelu analizy.

umieść kolumnę pooltag na pierwszym miejscu i dodaj kolumnę stack. Teraz załaduj symbole wewnątrz WPA.exe i rozwiń stos tagów, które widziałeś w poolmon.

Teraz znajdź inne sterowniki firm trzecich, które możesz zobaczyć w stosie. Tutaj tag Thre (Thread) jest używany przez AVKCl.exe z G-Data. Poszukaj aktualizacji sterowników/programów, aby to naprawić.

15
15
15
2013-11-12 05:41:48 +0000

Cóż, pierwsza rzecz, zanim przejdę do bardziej szczegółowej odpowiedzi. Na twoim pierwszym zrzucie ekranu, twoja pula Non-Paged Pool (rodzaj użycia pamięci jądra) jest na poziomie 1.3GB. Wydaje mi się to niezwykle wysokie, szczególnie dla zaledwie 30 minut po starcie systemu. Myślę, że mógłbym sobie wyobrazić NP Pool osiągający tak wysoki poziom po dłuższym czasie użytkowania lub z programem, który przeciekał jak sito. Dla kontrastu, mój NP Pool wynosi zwykle między 100 a 200 megabajtów, a mój paged pool może mieć nawet 400 lub 500 (i to po tym, jak mój system działa bez restartu przez tygodnie).


Możesz włączyć kilka dodatkowych kolumn w Menedżerze zadań, klikając prawym przyciskiem myszy nagłówki kolumn i wybierając opcję wybierz kolumny. Powinieneś dodać Working Set (private), Working Set (shared), Commit i NP Pool. Przeskanowałbym wszystkie twoje procesy od wszystkich użytkowników i zobaczyłbym, czy któryś z nich ma NP Pool większy niż około 256KB. Jeśli widzisz jakieś, zwłaszcza takie, które są znacznie wyższe, może to być źródłem problemu, lub przynajmniej jego częścią.

Twój całkowity zestaw roboczy, ilość pamięci fizycznej używanej przez proces, jest kombinacją prywatnego i współdzielonego zestawu roboczego (WS). Prywatny jest zazwyczaj większy dla większości procesów, jednak mogą być takie, które używają większej ilości współdzielonego WS. Te dwie wartości powinny być sumą całkowitego WS. Zaangażowanie jest ilością twojego zestawu roboczego, który został zaangażowany do magazynu kopii zapasowych (w większości przypadków, plik strony Windows). Aplikacje działające w tle często będą miały większy Commit niż WS, wskazując, że duża część ich puli stronicowania została zamieniona z pamięci do pliku stronicowania (co jest całkiem normalne dla aplikacji desktopowych, które zostały zminimalizowane i nie były używane przez jakiś czas).

Pula niestronicowana to pamięć, która nie może i nigdy nie będzie wymieniana z pamięci fizycznej… jest to efektywnie twoje stałe minimalne użycie pamięci fizycznej. Pamięć NP Pool często zawiera kod programu i krytyczne sekcje, które muszą być w pamięci fizycznej, aby zachowywać się poprawnie lub bezpiecznie, specjalne sterty, itp. Z 60 procesów, jeśli wszystkie z nich mają 256KB pamięci NP Pool, wtedy twoje absolutne minimum użycia pamięci fizycznej wynosiłoby około 15,360KB. W większości przypadków jedna lub dwie aplikacje mogą mieć 256KB NP Pool, podczas gdy większość ma mniej, często znacznie mniej (lub wcale). Jest bardzo mało prawdopodobne, aby system kiedykolwiek wyrzucił cały zestaw procesów, więc nie oczekuj, że użycie pamięci będzie tak niskie.


Wreszcie, celem posiadania większej ilości pamięci jest uniknięcie konieczności stronicowania danych do i z rozszerzonej przestrzeni pamięci (swap, plik strony) na dysku fizycznym. Stronicowanie jest procesem, który polega na przenoszeniu bloków przydzielonej pamięci fizycznej wokół, wypychając niektóre na dysk i przynosząc inne do pamięci fizycznej z dysku. Stronicowanie jest, mówiąc najprościej, wysoce niepożądane. Nie jest “złe” per-se, ale może być prawdziwym obciążeniem dla wydajności, gdy występuje zbyt często. Ostatecznym celem zwiększenia całkowitej ilości fizycznej pamięci RAM w systemie jest umożliwienie większej ilości procesów przechowywania większej ilości ich commitów w pamięci fizycznej (większy zestaw roboczy). Zużywanie pamięci nie jest problemem, a gdy więcej procesów używa więcej pamięci, całkowita wydajność systemu i wydajność aktywnych procesów będzie zazwyczaj wyższa, ponieważ aktywność dysku fizycznego związana z dostępem do pamięci (w szczególności błędy stron) będzie niższa.

Windows zarządza pamięcią za Ciebie i automatycznie stronicuje dane w pamięci i z pamięci do i z pliku strony (swap) za Ciebie. Jeśli uruchomisz proces, który potrzebuje 9GB pamięci, a Twój system używa już 4GB (z 12GB), to system automatycznie zorientuje się, które procesy nie potrzebują natychmiastowego dostępu do całego swojego zestawu roboczego, i będzie stronicował część lub całość ich stronicowanej puli do pliku wymiany, aby zwolnić ten dodatkowy 1GB. Jeśli duży proces w końcu potrzebuje więcej pamięci, Windows będzie dalej redukował zestaw roboczy innych procesów, aż będzie miał wystarczająco dużo wolnego miejsca, aby zaalokować nowo zażądany blok. Twój duży proces może ostatecznie zużyć całą dostępną pamięć z wyjątkiem NP Pool i być może jakiegoś dodatkowego minimalnego narzutu dla okresowo wykonywanych procesów, które nie pozwalają Windowsowi zwolnić więcej swojego zestawu roboczego (tj. mają oczekujące błędy strony, które Windows w przeciwnym razie wymieniłby z pamięci fizycznej, ale ponieważ są żądane, nie mogą zostać przeniesione).

Jeśli proces potrzebuje więcej pamięci niż ma dostęp (procesy 32bitowe mają zazwyczaj dostęp do 2Gb, a niektóre trochę mniej niż 4Gb z ulepszonymi technikami, podczas gdy procesy 64bitowe mają zazwyczaj dostęp do około 48Gb pamięci, każdy), wtedy Windows czasami spróbuje zwirtualizować swoją pamięć za pomocą przestrzeni wymiany. Jeśli aplikacja 32bit chce wykorzystać swoje maksymalne dozwolone 2Gb przestrzeni, ale tylko 1.2Gb są dostępne, Windows zarezerwuje pełne 2Gb w pliku strony i przeniesie własne dane procesów do i z pliku strony w razie potrzeby, aby wspierać wykorzystanie pamięci przez aplikację. Całkowite użycie “pamięci” w tym przypadku może wydawać się większe niż dostępna pamięć fizyczna, gdy idzie o Total Commit. Total Commit zazwyczaj osiągnie maksimum przy wielkości całego pliku strony, który zarządzany przez system, jest zazwyczaj 2-3 razy większy niż ilość pamięci fizycznej. W twoim przypadku, Total Commit wynosiłby około 24Gb, lub 2x 12Gb pamięci fizycznej (i to jest wskazane na pierwszym zrzucie ekranu, gdzie jest napisane: Commit (GB) 3 / 23).


Jedna ostatnia uwaga. Powiedziałeś w swojej odpowiedzi, że masz 16Gb pamięci RAM, podczas gdy Menedżer zadań widzi tylko 12Gb pamięci RAM. Jest tu jedna z dwóch rzeczy. Albo twój system naprawdę ma tylko 12Gb RAM, albo jeden z twoich patyków nie rejestruje się poprawnie. Jeśli chodzi o pamięć RAM (zakładam, że 4x 4Gb), może ona być uszkodzona, może nie być prawidłowo osadzona w płycie głównej lub płyta główna może mieć problem z wykrywaniem pamięci.

Aby sprawdzić, czy to ostatnie, powinieneś najpierw zaktualizować BIOS płyty głównej do najnowszej wersji. Miałem podobny problem… moje sześć pamięci Tripple-Channel DDR3 (6x 2Gb) były w porządku, bazując na indywidualnych testach każdej z nich… ale moja płyta główna losowo decydowała się nie liczyć jednej lub dwóch z nich co jakiś czas, często zostawiając mnie z tylko 8Gb pamięci. Aktualizacja BIOS-u naprawiła ten problem i mam teraz niezawodny dostęp do wszystkich 12 GB pamięci.

12
12
12
2013-11-12 01:35:00 +0000

Jak mogę się dowiedzieć, dlaczego mój Windows zużywa tak dużo pamięci RAM.

Używa tak dużo pamięci RAM, ponieważ jest do tego zaprojektowany. Nie ma absolutnie żadnych kosztów związanych z używaniem pamięci RAM. W rzeczywistości używana pamięć RAM jest lepsza niż wolna pamięć RAM, ponieważ system operacyjny nie musi nic robić, aby z niej korzystać. Użycie wolnej pamięci RAM wymaga jej użycia, co wymaga wysiłku.

Jeśli myślisz “Chcę mieć wolną pamięć RAM teraz, aby móc jej użyć później”, zapomnij o tym. Pamięć RAM nie musi być wolna teraz, aby użyć jej później. Możesz używać jej teraz i używać jej później. Nie ma żadnego kompromisu tutaj – nie ma absolutnie żadnych minusów używania pamięci RAM.

RAM jest używany i bezpośrednio przełączany z jednego użycia do drugiego bez konieczności przechodzenia przez wysiłek uczynienia go wolnym tylko po to, aby ponownie go użyć. Nowoczesne systemy operacyjne pozostawiają RAM wolną tylko wtedy, gdy nie mają innego wyboru.

2
2
2
2017-01-14 12:37:08 +0000

Powodem nie wymienionym powyżej jest Hyper-V.

Udało mi się go zidentyfikować za pomocą doskonałego narzędzia RamMap :

Zrzut ekranu jest z po. Przed “Driver Locked” pamięć wynosiła ponad 6GB, ponad 80% pamięci RAM w tej konkretnej maszynie. Musiałem wejść do Hyper-V Manager i wyłączyć “Dynamic Memory”. Co ciekawe, nawet po ponownym jej włączeniu, pamięć “Driver Locked” pozostała niska - mogę tylko przypuszczać, że poprzednie instancje zwiększyły ją i że Hyper-V nie redukuje automatycznie przydzielonej pamięci: