Dlaczego system Windows 2008 używa funkcji wymiany, zanim pamięć się zapełni?

9

Administruję serwerem Windows 2008 (cóż, na Amazon EC2) z uruchomionymi usługami IIS i aplikacją sieciową .NET4. Któregoś dnia dostałem alert o pamięci i poszedłem i spojrzałem, i na pewno pamięć procesu powiększyła się z czasem przez jakiś powolny wyciek. Niewiele wzrosła, tak jak 60M do 200M, ale wystarczająco dużo działo się z pudełkiem, że przekroczyło nasz dość niski próg (75%), aby uruchomić monitor.

Po ponownym przetworzeniu puli aplikacji i zwolnieniu pamięci zauważyłem, że po przejrzeniu statystyk zauważyłem, że miejsce wymiany zostało znacznie wykorzystane i że więcej niż 1 GB zostało zwolnionych dzięki temu recyklingowi.

Może to podstawowe pytanie, ale jestem facetem z UNIX-em i jestem przyzwyczajony do tego, że nie przyzwyczajam się, dopóki nie zabraknie ci pamięci. To pole nigdy nie przekroczyło 75% użycia pamięci. Czy jest to rzecz związana z Windows, platformą .NET czy Amazon? Podejrzewam, że w tej aplikacji jest znacznie większy wyciek pamięci niż się spodziewałem - nie przecieka z 60M do 200M, przecieka z 60M do 1,2GB, ale znaczna część z tego robi się „zimna” i zmuszana do wymiany?

W puli aplikacji mam ustawiony recykling pamięci, ale włącza on pełną pamięć, więc ta aplikacja może stać się naprawdę duża, zanim zacznie się automatycznie.

Mógłbym skonfigurować regularny recykling na czas, ale to obejście. Poproszę programistę, aby naprawił aplikację, ale muszę zrozumieć, co się dzieje z użyciem wymiany, aby upewnić się, że rozumiem to dobrze.

Edytuj z większą ilością informacji: pamięć instancji: zamiana 1,7 GB: 4,5 GB

Widzę proces w3wp.exe w taskmgr pokazujący, że pamięć: 211,000k. Ale kiedy go zrestartowałem (znajduje się we własnej puli aplikacji i jest to jedyna aplikacja na pudełku), zużycie pamięci spadło do normalnego punktu początkowego wynoszącego 60 mln i jak zwolniono 1 GB + wymiany. W taskmgr właśnie miałem zwykłą statystykę Memory (prywatny zestaw roboczy), ale widziałem zmianę wymiany poprzez inne monitorowanie (Cloudkick). Cofając się i patrząc na to dzisiaj, pamięć wraca do 195M w procesie (łącznie 1,2 GB), a swap wkradł się z 1,0 GB do 1,1 GB, ale nie do końca, tam gdzie był (wykresy w czasie, to jest powolne pełzanie).

Nie martwię się o tę konkretną aplikację, a bardziej o zrozumienie, kiedy Windows zamienia się i jak z niej korzysta, oraz o co należy się martwić w związku z danym użyciem pamięci i zamiany systemu Windows.

Ernest Mueller
źródło
4
BTW, przynajmniej Linux zamieni strony w sposób oportunistyczny, jeśli nie były dostępne przez długi czas, nawet jeśli system nie jest bliski korzystania z całej dostępnej pamięci RAM. Ma to na celu zwolnienie pamięci podręcznej dysku, buforów itp.
EEAA
Ile pamięci ma to wystąpienie? Mówisz, że proces w3wp.exe osiąga 1 GB? Czy to jedyna witryna działająca w tej puli aplikacji?
Kev
@ KevΩ Dodano więcej informacji w Q na żądanie.
Ernest Mueller
@ErikA, dobrze wiedzieć, chyba słuchałem facetów, którzy mówią: „jeśli zamieniasz, masz już bzdury, po prostu wyłącz swap i nie zabraknie pamięci RAM”, więc nie oglądam tak dużo wymiany.
Ernest Mueller
Jeśli twój dysk rzuca się na dysk, to prawda. Jeśli zamienia się, robi miejsce na bufory i tym podobne.
Bart Silverstrim

Odpowiedzi:

17

Windows i Linux mają dwie różne strategie zamiany stron / stron.

Linux

Linux chce w ogóle unikać korzystania z przestrzeni wymiany i czeka do ostatniej możliwej chwili. Jeśli widzisz dużą liczbę zamian w systemie Linux, twój system prawdopodobnie ma kłopoty. Ta strategia jest dobra w celu zminimalizowania całkowitego wejścia / wyjścia dysku, który jest najwolniejszą częścią twojego systemu, ale słabsza w przypadku systemów z naprzemiennymi okresami lekkiego i dużego obciążenia (i szczerze mówiąc, to większość z nas). Czasy, w których obciążenie jest już duże, będą teraz obciążone przez „dodatkowe” dyskowe operacje we / wy lub, innymi słowy, musisz zaprojektować kompilacje serwera z myślą o posiadaniu wystarczającej ilości pamięci RAM, której nie zamieniasz nawet podczas najwyższe oczekiwane czasy ładowania.

Windows

Windows chce traktować pamięć jako zwykłą pamięć podręczną pliku strony. Twoja prawdziwa pamięć jest zawsze na dysku, ale jeśli to możliwe, najpierw odczyta / zapisze z „pamięci podręcznej”. Ta strategia jest dobra na wyrównanie obciążenia w czasie; gdy system jest zajęty i musi podmieniać strony, bieżąca strona jest już na dysku, a połowa pracy jest już wykonana. Takie podejście miało ogromny sens, gdy Windows był młody, 32 MB (zapomnij GB) wciąż było dużo pamięci RAM, a częsta potrzeba korzystania z przestrzeni wymiany była oczywista. Nawet dzisiaj jest to dobre dla obciążeń roboczych, które zmieniają się między obciążeniami lekkimi i obciążonymi, ponieważ pomaga bardziej równomiernie rozłożyć dyskowe operacje we / wy w czasie.

Nowoczesne wersje systemu Windows mają dodatkowe optymalizacje - takie jak SuperFetch - w celu wstępnego ładowania i przygotowywania stron pamięci na dysku iw pamięci RAM, gdy obciążenie jest w przeciwnym razie niewielkie, aby uniknąć potrzeby zapisywania dodatkowego dysku podczas ładowania programu po raz pierwszy. Wszystko to oznacza, że ​​możesz zaprojektować system tak, aby potrzebował tylko wystarczającej ilości pamięci RAM na coś mniejszego niż najwyższe oczekiwane obciążenie, dzięki czemu nadal możesz mieć co najmniej akceptowalną wydajność przez cały czas przy obniżonych kosztach.

Konwergencja

Ta koncepcja mierzenia lub przewidywania obciążenia najpierw w środowisku testowym, a następnie alokacji zasobów produkcyjnych, gdy obciążenie jest znane, jest stosunkowo nowym postępem w budowaniu systemu, możliwym lub przynajmniej praktycznym, częściowo wraz z pojawieniem się serwerów wirtualnych, a następnie serwerów w chmurze . W zależności od obciążenia możesz nawet zaprojektować system tak, aby nigdy nie musiał się w ogóle zamieniać. W takich przypadkach system Windows pozwala wyłączyć stronicowanie i zachowywać się bardziej jak system Linux. Musisz jednak uważać; jeśli projekt systemu wymaga więcej pamięci niż oczekiwano, możesz w ten sposób wpaść w kłopoty.

Z drugiej strony współczesne jądra Linuksa chętniej wymieniają się dyskami oportunistycznie niż kiedyś. Różnica w strategiach zarządzania pamięcią między tymi dwoma systemami jest wciąż obecna, ale teraz jest mniej wyraźna niż kiedyś. Oba systemy mają swoje zalety, a każdy obserwuje drugi, aby zobaczyć, jakie postępy mogą skopiować.

Joel Coel
źródło
Bardzo konkretna strategia końcowa systemu Windows, dzięki! Sprawdziłem również, że ten KB firmy Microsoft znalazłem ... support.microsoft.com/kb/2267427
Ernest Mueller
1
Linux niekoniecznie czeka na ostatnią możliwą chwilę, chyba że jawnie ustawisz vm.swappiness = 0. Przy domyślnej wartości 60 zamienia strony, które nie były dotykane przez jakiś czas.
Kjetil Joergensen 12.12.12
@KjetilJoergensen koniecznie przeczytaj ostatni rozdział o konwergencji.
Joel Coel,
1
@JoelCoel Bezwarunkowo wycofuję moją krytykę :)
Kjetil Joergensen
7

Windows (oraz Linux i inne systemy operacyjne podobne do Uniksa) będą przenosić strony, które nie były używane przez pewien czas, na dysk, aby zrobić miejsce na bufory i pamięć podręczną, aby przyspieszyć aktywną aktywność we / wy. Również aplikacje często przydzielają więcej pamięci, niż będą od razu wykorzystywane - może to zachęcić jądro do stronicowania niektórych rzeczy, które nie były ostatnio dotykane w tle, dzięki czemu wspomniane aplikacje nie widzą opóźnienia stronicowania, gdy nagle się uruchamiają. używając tego przydziału.

Pod Linuksem możesz modyfikować (lub blokować) to zachowanie, zmieniając odpowiednie wartości „swapiness” w /procsystemie plików - bez wątpienia istnieją wartości rejestru, które możesz modyfikować, aby zmienić zachowanie Windows również w tym względzie.

Kolejną rzeczą, o której należy pamiętać, jest to, że gdy coś zostało stronicowane, a później ponownie odczytane, jądro nie usunie go z pliku strony, dopóki plik nie zostanie zapełniony lub strona w pamięci RAM nie zostanie zmieniona. W ten sposób, jeśli trzeba ponownie podzielić tę część strony, można to zrobić bez konieczności zapisywania stron na dysku: zawartość już tam jest. Może to znacznie poprawić wydajność w sytuacjach, w których nadmiar zatwierdzania pamięci jest tak zły, że powoduje przeładowanie plików stronicowania (znaczna liczba stron jest ciągle mapowana na zewnątrz). Prawdopodobnie zauważysz, że niektóre dane zostały wyparte przez wyciek pamięci i od tego czasu zostały odczytane z powrotem, ale nie zostały usunięte z dysku na wypadek, gdyby strony te musiały zostać zmapowane lub pamięć RAM, aby zrobić miejsce później. W systemie Linux wartość „SwapCached” w/proc/meminfopokazuje, ile danych znajduje się na stronach, które mają identyczne kopie w pamięci RAM i na dysku. Windows bez wątpienia używa tej samej optymalizacji (lub czegoś podobnego), ale nie jestem dokładnie gdzie szukać, aby zobaczyć, ile to się dzieje (bez wątpienia istnieją odpowiednie liczniki monitorów wydajności, które można zapytać).

tl; dr: To normalne. Nowoczesne jądro systemu operacyjnego będzie starało się być sprytnym i zmaksymalizować ilość pamięci RAM, którą może wykorzystać jako pamięć podręczną do zapisywania operacji we / wy, a czasami będzie kopiowało dane na dysk i do pamięci RAM, aby zaoszczędzić we / wy, jeśli będzie musiała przesłać te bity pamięci RAM później. Istnieje prawdopodobieństwo, wbrew intuicji, że takie użycie plików stron na dwa sposoby, nawet jeśli obecnie nie brakuje pamięci RAM, poprawia ogólną wydajność, a nie ją zmniejsza.

David Spillett
źródło