Mam serwer z systemem Windows Server 2008 R2 x64 z 4 GB pamięci RAM, który obsługuje około 2-3 miliony plików, z których większość to pliki graficzne.
W ciągu tygodnia zauważyłem, że aplikacje na serwerze zwalniają do indeksowania z powodu nadmiernego stronicowania na dysk z powodu niskiej pamięci, co powoduje efekt domina dla wszystkich aktualnie działających na nim usług, powodując poważne Problem z wydajnością.
Po sprawdzeniu w Menedżerze zadań zauważyłem, że prawie wszystkie 4 GB jest w użyciu, ale kiedy spojrzysz na zakładkę Procesy, suma całego zużycia pamięci nie sumuje się i najwyżej 1,5 GB powinno być w użyciu.
Używając Google do znalezienia rozwiązania, wydaje się, że większość pamięci RAM została wykorzystana w „Metapliku”, który jest pamięcią podręczną informacji NTFS dla plików w systemie plików, dzięki czemu system nie musi ponownie wysyłać zapytań do MFT o informacje. Ta pamięć podręczna nigdy nie jest czyszczona ani oznaczana jako „pamięć podręczna” w Menedżerze zadań lub jako „Czuwanie” w RamMap Sysinternal.
Była propozycja , aby zainstalować poprawkę KB979149 ale po próbuje go zainstalować, to mówi „Ta aktualizacja nie ma zastosowania do komputera”.
Jedyne tymczasowe poprawki, które do tej pory znalazłem, to:
- Użyj RAMmap z Sysinternals do „Opróżnij zestaw roboczy systemu” co 1-3 dni, co oznacza pamięć podręczną jako „tryb gotowości” i „pamięć podręczną” w Menedżerze zadań, dzięki czemu pamięć RAM może być używana przez inne aplikacje.
- Uruchom ponownie komputer, co jest niepożądane, ponieważ ten serwer obsługuje publiczne strony internetowe.
W tej chwili muszę wykonywać 2. naprawę co kilka dni, aby zapobiec osiągnięciu poziomów wąskiego gardła.
Przed: (Użyto 800 MB pamięci RAM - inne aplikacje nie mogą korzystać z tej pamięci RAM)
Po: (800 MB pamięci RAM oznaczonej jako pamięć podręczna - dostępne dla innych aplikacji)
Więc moje pytanie do was wszystkich brzmi: czy istnieje jakakolwiek metoda ograniczenia użycia pamięci RAM tego metapliku?
Odpowiedzi:
Najlepszą metodą radzenia sobie z tym problemem jest użycie
SetSystemFileCacheSize
interfejsu API zgodnie zinstrukcjąstosowaną w instrukcji MS KB976618 .Nie czyść okresowo pamięci podręcznej
Używanie tej
SetSystemFileCacheSize
funkcji zamiast czyszczenia pamięci podręcznej okresowo poprawia wydajność i stabilność. Okresowe czyszczenie pamięci podręcznej spowoduje usunięcie zbyt dużej ilości metaplików i innych informacji z pamięci, a system Windows będzie musiał ponownie odczytać wymagane informacje z powrotem do pamięci RAM z dysku twardego. Powoduje to nagły i poważny spadek wydajności przez kilka sekund po każdym wyczyszczeniu pamięci podręcznej, a następnie dobrą wydajność, która powoli spada, gdy pamięć zapełnia się danymi metapliku.Korzystanie z
SetSystemFileCacheSize
zestawów funkcji minimum i maksimum, co spowoduje oznaczenie przez Windows nadmiaru starych danych metapliku jako pamięci rezerwowej, którą normalne funkcje buforowania mogą wykorzystywać lub odrzucać zgodnie z bieżącymi wymaganiami zasobów i normalnymi priorytetami pamięci podręcznej. Pozwala to również na umieszczenie większej ilości danych metapliku niż ustawione maksimum pamięci aktywnej, jako dane rezerwowe, jeśli system Windows nie używa pamięci do niczego innego, zachowując jednocześnie dużo dostępnej pamięci. Jest to idealna sytuacja przez cały czas utrzymująca dobre parametry systemu.Programy innych firm nie są obsługiwane przez MS
Jeśli jesteś podobny do mnie i nie chcesz uruchamiać pliku binarnego od nieznanej strony trzeciej na twoich serwerach produkcyjnych, potrzebujesz oficjalnego narzędzia MS lub kodu, który możesz sprawdzić przed uruchomieniem na tych serwerach. Narzędzie DynCache dla 2008 R2 jest praktycznie niemożliwe do uzyskania z M $ bez płacenia za zgłoszenie do pomocy technicznej i, szczerze mówiąc, w oparciu o kod z 2008 roku wydaje się nadmiernie rozdęte dla zadania, ponieważ Windows ma już wbudowaną logikę potrzebną do dynamicznego rozmiaru pamięć podręczna - wystarczy znać odpowiednie maksimum dla twojego systemu.
Rozwiązanie wszystkich powyższych
Napisałem skrypt Powershell, który działa na komputerach 64-bitowych. Musisz uruchomić go jako administrator z podwyższonymi uprawnieniami. Powinieneś być w stanie go uruchomić, tak jak jest, na dowolnym systemie Windows x64 Vista / Server 2008 do 10 / Server 2012 R2 włącznie z dowolną ilością pamięci RAM. Nie musisz instalować żadnego dodatkowego oprogramowania, dzięki czemu Twój serwer / stacja robocza będzie w pełni obsługiwana przez MS.
Powinieneś uruchomić ten skrypt przy każdym rozruchu z podwyższonymi uprawnieniami, aby ustawienie było trwałe. Harmonogram zadań systemu Windows może to zrobić za Ciebie. Jeśli instalacja systemu Windows znajduje się na maszynie wirtualnej i zmienisz ilość pamięci RAM przydzielonej do tej maszyny wirtualnej, powinieneś ją również uruchomić po tej zmianie.
Możesz uruchomić ten skrypt w dowolnym momencie na uruchomionym systemie, nawet w trybie produkcyjnym, bez konieczności ponownego uruchamiania systemu lub zamykania jakichkolwiek usług.
U góry znajduje się wiersz, który mówi,
$MaxPercent = 12.5
że ustawia nowy maksymalny zestaw roboczy (pamięć aktywna) na 12,5% całkowitej fizycznej pamięci RAM. System Windows dynamicznie zmieni rozmiar danych metapliku w aktywnej pamięci na podstawie wymagań systemowych, więc nie trzeba dynamicznie dostosowywać tego maksimum.To nie rozwiąże żadnych problemów z zbyt dużą pamięcią podręczną mapowanych plików.
Zrobiłem również
GetSystemFileCacheSize
skrypt Powershell i opublikowałem go na StackOverflow .Edycja: Powinienem również zwrócić uwagę, że nie powinieneś uruchamiać żadnego z tych 2 skryptów z tej samej instancji Powershell więcej niż jeden raz, albo pojawi się błąd, że
Add-Type
wywołanie zostało już wykonane.Edycja: zaktualizowano
SetSystemFileCacheSize
skrypt do wersji 1.1, który oblicza odpowiednią wartość maksymalnej pamięci podręcznej i ma ładniejszy układ wyjściowy statusu.Edycja: Teraz zaktualizowałem mój laptop z systemem Windows 7, mogę powiedzieć, że skrypt działa poprawnie w systemie Windows 10, chociaż nie przetestowałem, czy nadal jest potrzebny. Ale mój system jest nadal stabilny nawet podczas przenoszenia plików dysków twardych maszyny wirtualnej.
źródło
Nie twierdzę, że jestem ekspertem w zakresie wewnętrznego działania pamięci lub pamięci podręcznej dysku w systemie operacyjnym Windows, ale mam dwie spostrzeżenia:
Gdyby system operacyjny nie buforował danych w pamięci, musiałby je odczytać z dysku, który jest wykładniczo wolniejszym nośnikiem pamięci niż pamięć, więc problem z wydajnością, który widzisz teraz, prawie na pewno byłby gorszy.
Próbujesz rozwiązać problem, lecząc objaw problemu zamiast jego przyczyny. Przyczyną problemu jest prawie na pewno brak wystarczającej fizycznej pamięci RAM, a moją sugestią byłoby zaradzenie temu.
Ponadto, chociaż pamięć podręczna może wykorzystywać 1,5 GB pamięci RAM, zastanawiałbym się, jakie jest zużycie pamięci na inne procesy i usługi, a rozwiązaniem może być zbadanie tego wykorzystania pod kątem potencjalnych problemów.
źródło
Ludziom, którzy dali oczywiste, ale nieskuteczne rozwiązanie polegające na dodaniu większej ilości pamięci RAM, najwyraźniej nie poradziliście sobie z tym problemem z pierwszej ręki.
Jak stwierdzono we wcześniejszym plakacie, nie ma znaczenia, ile pamięci RAM rzucisz na problem ... wszystko się zapełni. Korzystam z zestawu narzędzi Atlassian na naszym serwerze aplikacji, który został migrowany z wersji 32-bitowej (2003) do 64-bitowej (2008). Natychmiast stało się jasne, że nastąpiła utrata wydajności.
Patrząc na menedżera zadań, prawie cała pamięć została zużyta; nawet jeśli uruchomione procesy nie odzwierciedlają tego. Gdy zwiększyliśmy pamięć z 8 GB do 16 GB, problem zużył również dodatkową pamięć.
Jedynym sposobem na rozwiązanie tego problemu było zrestartowanie serwera, co obniżyło zużycie pamięci równe procesom (około 3,5 GB). Zaczęło się to wspinać ponownie w ciągu około jednego dnia.
Wiedziałem, że to nowy błąd / funkcja Microsoft i z przyjemnością znalazłem ten artykuł. Uwielbiam sposób, w jaki Microsoft pozostawia ten niezwykle ważny szczegół użytkownikom. Pobrałem RamMap, który mógłby być rodzimym narzędziem, i teraz widzę użycie Metafile. Ustawimy pamięć podręczną na czyszczenie co kilka dni i mam nadzieję, że to rozwiąże problem.
Interesujące jest to, że widziałem ten problem tylko na jednym z kilku migrowanych serwerów, więc zastanawiam się, czy metaplik jest zasilany tylko z niektórych rodzajów aplikacji.
źródło
Ten problem można rozwiązać szybko i za darmo za pomocą narzędzia SysInternals CacheSet. Wystarczy ustawić maksymalny zestaw roboczy na odpowiednią wartość mniejszą niż ilość pamięci RAM systemu i zastosować.
źródło
Przepraszam, że jestem tak bezpośredni, ale co z uaktualnieniem serwera do ilości pamięci RAM, która jest nieco wyższa niż w dzisiejszych stacjach roboczych? Memboy 16 GB są cholernie tanie. Tańsze niż nawet pół dnia twojego czasu.
źródło
Oto link do pobrania narzędzia Microsoft DynCache - nie trzeba tworzyć biletu ani płacić. http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=9258
(przepraszam - zauważam tylko teraz, że nie jest to wersja R2)
Znany problem dla dalszego wzrostu cache jest opisany tutaj na blogu Microsoft: http://blogs.msdn.com/b/ntdebugging/archive/2007/11/27/too-much-cache.aspx
[aktualizacja] poprawka działania systemu Windows Server 2008 R2.
Znalazłem przykładowy kod C # na Codeplex, szybko utworzyłem konsolowy projekt C # z Visual Studio i skompilowałem, działałem.
Uwaga: musisz dodać odwołanie do Microsoft.AnalysisServices.AdomdClient, które można znaleźć tutaj:
i skomentuj metodę ClearAllCaches () za pomocą (w moim przypadku) niepotrzebnych odniesień do XMLaDiscover. Rzuć to do TaskScheduler.
źródło
Możesz pobrać narzędzie DynCache od MS, które pozwoli ograniczyć użycie pamięci RAM przez metaplik.
Kliknij tutaj, aby pobrać narzędzie z MS .
źródło