przystajnik

Uwalnianie pamięci RAM z śmieci

Zrób to samWszyscy doskonale znamy specyfikę zagospodarowania pamięci przez kernel Linuksa. Podczas gdy osoby początkujące zżymają się, że większość poleceń sprawdzających wykazuje zużycie pamięci na poziomie 95%, my cieszymy się, że nieużywana pamięć przeznaczana jest na bufory i pamięć podręczną operacji I/O. Wiemy też bardzo dobrze, że gdy wzrośnie zapotrzebowanie na pamięć, kernel zluzuje zaalokowane na swoje potrzeby zasoby. Co jednak w przypadku, gdy tak się nie dzieje, a sprzęt z nikczemną ilością pamięci pracuje coraz to mozolniej?

Powodów dla których kernel postanawia zatrzymać zarezerwowaną pamięć RAM, może być kilka – mniej lub bardziej zasadnych w naszym odczuciu (kwestia dystrybucji, wersji kernela, operacji dyskowych, itp.). Jeżeli jesteśmy przekonani, że pamięć cache systemu plików stoi na drodze naszego dobrego samopoczucia i sprawności użytkowania komputera, pozostaje nam jedno wyjście. Przekonać kernel, aby cyklicznie zwalniał te zasoby. Bo bądźmy szczerzy – jak sama nazwa wskazuje, pamięć cache przyśpiesza operacje I/O przy dużej ilości trafień (czyli powtórzeń dostępu do tej samej porcji danych), a nie samym swoim istnieniem. Niestety, z braku statystyk wykorzystania pamięci cache, jednym sposobem sprawdzenia jak to wygląda w naszym przypadku (czyli czy specyfika naszej pracy, to np. odczytywanie z dysku tych samych danych, czy też nie), to testy i próby. Brzmi odpychająco? Ale to nic skomplikowanego.

Zaczynamy od tego, że upewniamy się o dramatycznym stanie wykorzystania pamięci RAM na cache i bufory. Wydając polecenie ‚free -m’ otrzymujemy zużycie pamięci:

$# free -m
             total       used       free     shared    buffers     cached
Mem:          3946       2521       1425          0         20        794
-/+ buffers/cache:       1705       2240
Swap:         4502          0       4502

Choć powyższe nie wygląda w moim przypadku dramatycznie, to osoby z 1 – 2GB pamięci mogą zauważyć u siebie nieciekawe proporcje cached w stosunku do total. Aby przekonać kernel o zwolnieniu tych zasobów, wykorzystamy… mechanizm odpowiadający za zwolnienie tych zasobów (Drop_Caches):

sudo sync
sudo echo 3 > /proc/sys/vm/drop_caches
sudo sysctl -w vm.drop_caches=3

Sprawdzamy za pomocą ‚free -m’ efekty:

$# free -m
             total       used       free     shared    buffers     cached
Mem:          3946       1944       2001          0          1        126
-/+ buffers/cache:       1816       2130
Swap:         4502          0       4502

I jak widać, jest luźniej (kolumna buffers i cached). Należy pamiętać, że tym samym nasz komputer zwiększy ilość odwołań do dysku twardego (gdy będzie musiał coś odczytać), dlatego wspominałem wcześniej o konieczności samodzielnego wykonania własnego bilansu zysków i strat.

No dobrze, komendy może i ciekawe, ale za jakiś czas ponownie kolumny ‚cached’ i ‚buffers’ się zapełniają niezliczoną liczbą bajtów. Dlatego gdy stwierdzimy, że to rozwiązanie jest dla nas dobre i skuteczne, wykorzystujemy Crona, by co 5 – 15 minut automatycznie wykonał to, co wpisywaliśmy powyżej. Zlecamy mu co następuje:

sudo gedit /etc/cron.d/dropcaches

… i wklejamy:

*/5 * * * * root sync && echo 3 > /proc/sys/vm/drop_caches

Zapisujemy. Powyższa linijka spowoduje, że Cron co 5 minut (*/5, ale możemy też co 10 minut */10 – lub */15) wykona nasze polecenie (sync && echo 3 (…)).

Jak wspomniałem, osoby z większą ilością pamięci pewnie nawet nie muszą się zastanawiać nad takim rozwiązaniem – o ile nie używają dystrybucji z ‚defektem’ luzowania buforów dyskowych. Ale niektóre słabsze konfiguracje (komputer z 1GB pamięci słabszy… jak to brzmi…) mogą poczuć zbawienny wpływ powyższych machinacji.
 

Post navigation

7 comments for “Uwalnianie pamięci RAM z śmieci

  1. Dwimenor
    22 stycznia, 2013 at 8:52

    W razie zwiększonego zapotrzebowania na pamięć operacyjną kernel i tak zwolni cache i bufory aby zmieścić inne programy.
    Ale użytkownik dobrze się czuje widząc, że masz „wolny” ram. W praktyce, niewykorzystany ram to zmarnowany ram.

  2. Łukasz Latacz
    22 stycznia, 2013 at 9:04

    efekt:
    sudo echo 3 > /proc/sys/vm/drop_caches
    bash: /proc/sys/vm/drop_caches: Brak dostępu

  3. salvadhor
    22 stycznia, 2013 at 10:07

    Kolejny dowód na to, że noc służy do spania, a nie pisania zaawansowanych ideologicznie postów techniczno-użytkowych 🙂 Oczywiście, biję się w piersi, moje niedopatrzenie, a użycie do tego celu sysctl sprawdza się jak należy.

    Dzięki za czujność.

  4. salvadhor
    22 stycznia, 2013 at 10:11

    To wszystko prawda, ale prawda teorii niekoniecznie zawsze idzie w parze z prawdą praktyki – widywałem systemy, które 20 – 30% z 1GB pamięci uparcie rezerwowały na bufory/cache, a programy użytkownika i dane zrzucały na dyskowy swap. Dlaczego, w jakim celu – któż to wie. Nie jest to regułą, dlatego wspomniałem o samodzielny upewnieniu się o humorach używanej dystrybucji.

  5. 23 stycznia, 2013 at 10:47

    Najlepiej robić sync przed zwalnianiem czegokolwiek i nie powinny wystepowac żądne problemy.

  6. totalizator
    23 stycznia, 2013 at 15:02

    Uwalnianie ramu – specyficzna forma spędzania wolnego czasu już od chwili premiery Windowsa 95. Ostatnio wypierana przez tuning dysków SSD w celu uchronienia tychże przed niechybnym, przedwczesnym zużyciem w perspektywie najbliższych dwustu lat. Dooh.

  7. agilob
    25 stycznia, 2013 at 0:15

    Tylko czemu zamiast edukować nowych użytkowników, że wszystko jest OK bo tak działa Linux, który nie jest WindowsNT, daje się im takie wskazówki, które są zupełnie niepotrzebne?

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Translate »