Ile swap w Windows?

Pamięć teraz jest (stosunkowo) tania. Często pojawiają się w związku z tym pytania “jeśli mam 2GiB RAM, to czy mogę wyłączyć plik wymiany?”. A ja się pytam – po co?

Myślę, że jednym z istotniejszych powodów tych pytań jest niezrozumienie tego jak Windows gospodaruje pamięcią. A może i trochę błędne oznaczenia niektórych wskaźników w Task Manger. Dlatego zamieszczę tutaj uproszczone wyjaśnienie tego, co się dzieje z pamięcią.

Po pierwsze wykres oznaczony jako PF Usage jest źle nazwany. Odpowiednią nazwą jest raczej Commit Charge. Określa on jak wiele pamięci (fizycznej i pliku wymiany) jest aktualnie zajętej.

Po drugie wartość Available w seksji Physical Memory nie oznacza wcale ilości nieużywanej pamięci. Można to zweryfikować przy pomocy narzędzi Debugging Tools for Windows. W chwili obecnej Teoretycznie mam 210 000 K dostępnej pamięci. A co mówi debugger:

lkd> !memusage 0x8 loading PFN database loading (100%25 complete) Compiling memory usage data (99%25 Complete). Zeroed: 15079 ( 60316 kb) Free: 22 ( 88 kb) Standby: 37493 (149972 kb) Modified: 697 ( 2788 kb) ModifiedNoWrite: 0 ( 0 kb) Active/Valid: 76898 (307592 kb) Transition: 768 ( 3072 kb) Unknown: 0 ( 0 kb) TOTAL: 130957 (523828 kb)

Strony pamięci podzielone są na kilka “typów”:

Co oznaczają poszczególne typy? Strony zeroed są to strony, które mogą być natychmiast wykorzystane przez system, w przypadku, gdy potrzebna jest pamięć. Zanim pamięć zostanie przydzielona procesowi, musi zostać wyzerowana. Wynika to z wymagań związanych z bezpieczeństwem. Jeśli tak by nie było, proces, który otrzymał tę pamięć, mógłby czytać zawartość pamięci procesu, który posiadał ją przed nim.

Strony Free zawierają “brudne” dane, a więc przed przypisaniem procesowi użytkownika, muszą najpierw zostać wyzerowane.

Strony Standby... to jest właśnie ciekawy fragment. W Windows istnieje pojęcie Working Set. Oznacza ono (w uproszczeniu) fragment pamięci fizycznej wykorzystywanej przez konkretny proces. Chodzi o to, że nawet jeśli jakiś program w danej chwili zajmuje 256 MiB pamięci, to w pamięci fizycznej znajduje się jedynie część. Teraz jeśli dana strona “wypada” z Working Set, to jest zapisywana do pliku wymiany, ale nie jest usuwana z pamięci. Strony, które nie zostały zmodyfikowane od czasu ostatniego zapisu na dysk, są właśnie na liście standby. Jeśli system będzie potrzebował dostępu do tej strony, to nie zostanie ona załadowana z dysku (z pliku wymiany), tylko wykorzystana bezpośrednio z pamięci fizycznej.

Strony oznaczone jako Modified są to strony, które zostały zmodyfikowane od czasu ostatniego zapisu na dysk. Strony te nie należą do Working Set żadnego procesu. Zanim pamięć z tych stron zostanie wykorzystana ponownie, zawartość strony musi zostać najpierw zapisana do pliku wymiany.

Strony ModifiedNoWrite to strony oznaczone jako “niezapisywalne” na dysk (ich zawartość nie zostaje przeniesiona do pliku wymiany).

Strony Active/Valid to strony, które są częścią Working Set lub nie są już częścią Working Set, ale istnieje prawidłowe wskazanie na tę stronę.

Strony Transition to strony w stanie tymczasowym w trakcie gdy są przenoszone na dysk.

I teraz co się dzieje w przypadku, gdy trzeba “załadować do pamięci fizycznej” stronę? Mogą zdarzyć się następujące przypadki:

Jeśli strona znajduje się w pliku wymiany, to musi zostać załadowana do pamięci z dysku. Koniec, kropka.

Jeśli wymagana jest nowa strona pamięci, to jest ona “wygospodarowywana” z listy Zeroed. Jeśli tej pamięci jest za mało, to pamięć jest odzyskiwana (z listy free lub listy standby).

W trzecim przypadku żądana strona pamięci jest już w pamięci fizycznej, więc nie trzeba jej ładować na nowo. Zmienia się tylko jej stan na Active/Valid.

Teraz wracając do przykładu – to, co jest przez Task Manager określane jako “dostępna pamięć fizyczna”, zawiera w sobie również te strony pamięci, które mogą zostać wykorzystane (w sensie zamienione przez inne), gdy zajdzie taka potrzeba, lub też może zostać bezpośrednio wykorzystana ich zawartość.

Jak więc określić ile stron pamięci rzeczywiście jest czytane z pliku wymiany? Tutaj pomocny jest perfmon , a konkretnie wskaźnik Memory\Pages Input/s. Jeśli rzeczywiście w trakcie “normalnej” pracy wskaźnik ten w sposób ciągły pokazuje, że strony są ładowane z dysku, oznacza to, że pamięci w systemie jest po prostu za mało.

Dlaczego nie opłaca się wyłączać pliku wymiany? Dlatego, że jeśli pamięci nie brakuje, to system nie będzie potrzebował ładować niczego z pliku wymiany, nawet, jeśli coś do niego zapisze. Degradacja wydajności przez proces zapisywania stron pamięci do pliku wymiany jest pomijalna.

A jak duży powinien być plik wymiany? Przede wszystkim powinien mieć stałą wartość. A co do wielkości, to ja zawsze zaczynam od 256MiB (większość komputerów, które mam, ma 512MiB RAM). Co prawda w starych zaleceniach była mowa o przeliczniku 1.5 * RAM, ale to nie ma sensu przy obecnej wielkości pamięci RAM. Raczej należy obserwować wskaźnik szczytowego wykorzystania pamięci (w Procexp wskaźnik Commit Charge –> Peak/Limit) i tak dobrać wielkość pliku wymiany, by wskaźnik ten wynosił około 75%25. U mnie się sprawdza... Ostatnio musiałem podnieść wielkość pliku wymiany z 256MiB na 512MiB, bo niestety Google Earth dość zachłanne jest...

Oryginał tego wpisu dostępny jest pod adresem Ile swap w Windows?

Autor: Paweł Goleń