ewangelista.IT
Mariusz KędzioraTechnical EvangelistMicrosoft Polska
Nazywam się Mariusz Kędziora i pracuję w polskim oddziale Microsoft w dziale Developer & Platform Group (DPG) jako Technical Evangelist.
W blogu postaram się przekazywać Wam ciekawe informacje o technologiach Microsoft w trochę luźniejszej formie niż to jest w dokumentacji czy na oficjalnych stronach Microsoft.
This post is provided "AS IS" with no warranties, and confer no rights. This weblog does not represent the thoughts, intentions, plans or strategies of Microsoft or any other company or organization. Because a weblog is intended to provide a semi-permanent point-in-time snapshot, you should not consider out of date posts to reflect current thoughts and opinions.
Zaczęło się od pewnego stwierdzenia na blip.pl.
“No masakra, ale mi Windows połyka RAM”
Ale nie jest to pierwsze pytanie tego typu jakie widziałem. Ale do napisania paru słów natchnęła mnie odpowiedź innego użytkownika blip.pl na to powyższe stwierdzenie.
“I znowu to samo, naprawdę chcesz, by Twój RAM się marnował nie używany?”
A że pytań faktycznie jest trochę, to pomyślałem, że spróbuję napisać w kilku zdaniach dlaczego ten Windows “zużywa” tyle tego RAMu.
Dwa słowa wstępu. Jedną z poważniejszych rzeczy nad jakimi przysiedli inżynierowie tworzący kolejny system operacyjny (czyli Windows 7) była właśnie wydajność.
Pierwsze pytanie jakie się pojawia to – jak rozumieć wydajność? Czy będzie to:
Nie ma jednoznacznej odpowiedzi na to pytanie, ale bardzo duża grupa osób myśli, że mała ilość dostępnej pamięci RAM oznacza, że Windows ją zjada i jest przez to mało wydajny.
WIndows już w poprzedniej wersji (w Windows Vista) pokazał mechanizm SuperFetch. Miał on za zadanie ładować pewne dane do pamięci – te które system uznał za takie, które często używamy. Nawet jeśli w danej chwili zupełnie ich nie używaliśmy.
Miało to powodować dużo szybsze i wydajniejsze korzystanie z tych danych – bo zawsze były dostępne w pamięci, gdzie dostęp jest dużo szybszy niż do dysku.
I tu już pierwsze światełko – WIndows wrzuca do pamięci RAM coś z czego może wcale nie korzysta w danej chwili, ale robi to świadomie!
Mamy 2 GB pamięci RAM. Z tego akurat w danej chwili wykorzystywane jest 500 MB.
Windows wrzuca więc do pamięci dodatkowe dane, które uważa, że mogą nam się przydać (bo często z nich korzystamy). Zajmuje więc RAM do poziomu powiedzmy 1.5GB.
Z naszego punktu widzenia wydaje się, że Windows zjada nam właśnie te 1.5 GB pamięci i wolnego mamy tylko 500 MB.
Ale jeśli tylko okaże się, że odpalamy aplikację np. Firefoxa i potrzebujemy na to 500 MB, to Windows w jednej chwili wyrzuca dane z RAMu, których nie potrzebuje (zarezerwowane przez SuperFetch).
Robi nam się znowu 500 MB wykorzystane przez system i inne aplikacje, do których dorzucamy te 500 MB potrzebne. Mamy więc zajęte 1 GB.
W kolejnym kroku Windows może znowu zarezerwować sobie miejsce na przydatne dane.
Założenie z jakiego wyszli inżynierowie Windows było proste – pamięć, z której nie korzystamy jest pamięcią, która się marnuje!
Tak więc wypełnienie tej wolnej pamięci danymi, które mogą się przydać jest lepszym wyjściem niż jej marnowanie.
Po prostu w sytuacji gdy jednak się okaże, że dane załadowane przez SuperFetch do pamięci (a są to dane, z których statystycznie najczęściej korzystamy) są potrzebne – to dostęp do nich jest zapewniany praktycznie od razu.
Gdyby ich tam nie było – dostęp do nich byłby opóźniony przez potrzebę odczytania ich z dysku – co jednak trochę zajmuje.
Jeśli uruchomicie sobie Task Managera (Menadżera Zadań) i przejdziecie na zakładkę Performance (Wydajność) to zobaczycie tam taki widok:
Zwrócić trzeba uwagę na zaznaczone parametry:
Zazwyczaj gdy patrzymy ile mamy jeszcze wolnej pamięci to odczytujemy wartość tylko Free. [u mnie to ok. 3 GB]
Natomiast jak możecie zauważyć na mojej maszynie z 8 GB RAMu prawie 2 GB jest “zjedzone” przez dane zapisane dzięki SuperFetch (parametr “Cached”). Ale dane te w dowolnej chwili mogą być błyskawicznie zwolnione w razie potrzeby.
Jeśli więc faktycznie chcecie zobaczyć ile macie pamięci wolnej powinniście zsumować wartość Free + Cached.
U mnie wolnego RAMu w takim razie mogę mieć ok. 3 GB + 2 GB czyli 5 GB.
Na komputerach z mniejszą ilością RAM będziecie mieli jeszcze bardziej “wiarygodne” wyniki.
Zachęcam do sprawdzenia jak te parametry wyglądają u Was.
Dla chętnych do przeczytania rozbudowanych informacji na ten temat - polecam przeczytać artykuł po polsku (tłumaczenie oryginału) na temat wydajności Windows 7. Napisali go inżynierowie tworzący Windows 7.
Dla naprawdę bardzo dociekliwych polecam ciekawy artykuł Marka Russinovicha z TechNet Magazine z 2007 roku o mechanizmie SuperFetch i nie tylko.
Mam nadzieję, że udało mi się choć trochę wyjaśnić problem “zjadania pamięci RAM przez Windows”.
Bardzo fajnie wytłumaczyłeś to zagadnienie - osobiście nic wcześniej na ten temat nie czytałem.
Pisałeś o nowym mechanizmie "SuperFetch", który został wdrożony w Viście - stąd też moje pytanie: skoro SF był już wtedy to skąd opinie o tym systemie, że działa wolniej niż poprzednicy?
Zagadnienie fajnie wyjaśnione, ale musiałem skomentować, jak można się zastanawiać co oznacza wydajność. Jest jednoznaczna odpowiedź. Ogólnie to ilość wykonanej pracy w jednostce czasu. Jedynie czymś innym może być określana praca w zależności od tego jaki system bierzemy pod uwagę (komputerowy, operacyjny, system pracy...).
I z całą pewnością nikt nie bierze nic innego pod uwagę...
@Łukasz Kliś: Z tą Vistą - problem brał się chyba z kilku powiązanych powodów. Myślę, że jednym była ogólna niechęć do Visty i słabe przygotowanie systemu (trochę nasza wina) od strony obsługi przez producentów sprzętu (sterowniki, itp.). Drugim elementem był pewnie sprzęt, który nie do końca był przygotowany na taki system. Trzecim było pewnie to, że kilka rzeczy zostało jeszcze poprawionych do czasu WIndows 7, a SuperFetch był tylko jednym z elementów związanych z wydajnością.
Ja od siebie mogę powiedzieć, że przy mocnym laptopie jaki wtedy miałem (4 GB RAM) nie miałem ŻADNYCH problemów z wydajnością Visty. No ale wtedy standardem było 1GB a czasami nawet mniej.
@Łukasz Grala: No wiedziałem, że jak za bardzo uproszczę to pojawią się uwagi do tej wydajności ;) ALe oczywiście dziękuję za tą uwagę, bo jest jak najbardziej słuszna w teoretycznym/akademickim podejściu.
I są ludzie, którzy będą uznawali że system jest wydajny wtedy jak im się system uruchomi w 10 sekund (a reszta jest nieważna), albo tacy co uznają go za wydajny jak im się przeglądarka uruchomi w 3 sekundy. Są też tacy co myślą o tym w kontekście właśnie wolnej pamięci RAM i pewnego potencjału komputera. Więc stwierdzenie że "nikt nie bierze nic innego pod uwagę" jest trochę na wyrost :)
Ale globalnie oczywiście się zgadzam z definicją wydajności podaną przez Ciebie.
A skąd w monitorze zasobów w windows7 pojawia się pamięć określona jako hardware reserved? U mnie jest to 259MB na 4GB dostępnej pamięci. To jest pamięć przydzielona karcie graficznej? Jeśli tak, to czy da się zmienić ilość tej pamięci?
@mt3o: W wolniejszej chwili spróbuję napisac parę słów na ten temat. Jak masz ochotę to trochę znajdziesz m.in. u Marka Russinovicha.
Jakąś podpowiedź znajdziesz też tutaj i tutaj.
"Jeśli więc faktycznie chcecie zobaczyć ile macie pamięci wolnej powinniście zsumować wartość Free + Cached."
To zdanie jest trochę wprowadzające w błąd. Cached to miejsce w pamięci, które jest zaalokowane w danej chwili na poczet SF, wiec nie jest to pamięć dostępna (Free) w tym konkretnym momencie, ale może być do dyspozycji systemu, jeśli zajdzie taka potrzeba. Moim zdaniem to jednak jest mała acz istotna różnica. :) A reszta jest OK.
Czy ktoś się orientuje czy i jak można sprawdzić dla jakich programów system zarezerwował pamięć... (tylko proszę nie pisać "dla najczęściej uruchamianych" ;-))
@Kristof: Nie wiem i spekuluję, ale... może zrobić dump pamięci RAM i przeanalizować go? :)
Wydaje mi się, że narzekania na "zjadanie" pamięci w W7 to relikt Windowsa XP. W Viście i 7 pamięć jest już zarządzana inaczej niż wcześniej ale nie wszyscy o tym wiedzą i stąd tyle narzekań.
Bardzo dobry wpis.
To jest chyba "cena rozwoju". Jeśli pomyśleć ile dało się wycisnąć z 8-bitowych komputerów z 64kB RAM to widać, że stosunek efektu to użytej pamięci znacznie spadł. Wynika to z wielu czynników. Nikt już nie pisze w asemblerze dbając o każdy bajt pamięci. Pamięć stała się tańsza a techniki programowania bardziej pamięciożerne. Dane otoczono obiektami, które przechowują także informacje o danych itp. Poza tym systemy robią coraz więcej zadań w tle.