Android – swap na karcie pamięci. Warto czy nie?

04/08/2011 – 23:07

Android słynie z wielu modyfikacji. Są one szczególnie pomocne w momencie kiedy producent danego telefonu, potrafi porządnie skopać swój własny model, lub w momencie kiedy brakuje nam czegoś w systemie, a co jest nam koniecznie potrzebne, a producent nie kwapi się o żadną aktualizację.

Użytkując swój dawny telefon, Samsung Galxy Spica, doszedłem do wniosku, że nie jest to wcale aż tak tragiczny model, jak niektórzy to określają (ale o tym kiedy indziej). Niewiele rzeczy brakowało mi w Spicy, patrząc na niego jak na swój pierwszy smartfon z Androidem.

Niemniej, przede wszystkim brakowało mi wolnej pamięci RAM. Po uruchomieniu komórki, w Spicy zostawało dla mnie średnio 70 MB pamięci RAM, co w bardzo szybkim tempie potrafiło zejść nawet do 20 MB. Niby 20 MB zostało, jednakże przy takiej ilości Android traci swoją wielką zaletę – płynność i wielozadaniowość. System po prostu zwalnia i to dość porządnie.

Rozwiązań jest wiele. Nie katować telefonu dużą ilością aplikacji uruchamianych w krótkim czasie i przełączaniem się między nimi, nie uruchamiać zbyt wielu daemonów, pozostawiając tylko te konieczne, lub po prostu skorzystać ze swapu.

Swap w przypadku Androida działa trochę inaczej niż na dystrybucjach Linuksowych. Przede wszystkim, w swap (zazwyczaj) nie jest wrzucana zawartość pamięci aktualnie działającej aplikacji, lecz aplikacji uśpionych. Co to oznacza w praktyce? Przy założeniu, że mamy zajęty cały RAM przez aplikacje A, B, C, D, a chcąc uruchomić aplikację X, która wymaga tyle pamięci co A i B razem wzięte, Android wpierw przerzuci zawartość pamięci programów A i B z RAM-u do swap, a dopiero potem załaduje do RAM-u aplikację X. Działa to tak, a nie inaczej, głównie ze względu na inne zarządzanie pamięcią przez Androida.

Zaletą takiego zrzucania aplikacji do swapu jest to, że nowo uruchomiona aplikacja nie straci swojej wydajności, gdyż wszelkie potrzebne dane będą w ramie, co w szczególności widoczne jest w przypadku gier, bądź innych programów obciążających komórkę (przeglądanie ciężkich stron Internetowych, Flash, etc.). W momencie jeżeli będziemy chcieli ponownie wrócić do aplikacji, która została zrzucona do swapu, system nie przeniesie jej z powrotem do RAM-u, dlatego jej przywrócenie potrwa trochę dłużej (pamiętajmy o różnicy szybkości odczytu ze swapu, a ramu). Oczywiście cała sytuacja może ulegnąć zmianie po X minutach, kiedy androidowy task killer, zechce nam ubić coś, o czym zapomnieliśmy, a również siedziało sobie w ramie.

Osobiście jednak nie polecam aż tak zachwycać się swapem na komórce, głównie ze względu na szybkość zapisu i odczytu. W przypadku Androida, swap najczęściej możemy utworzyć na karcie pamięci telefonu, a te niestety nie grzeszą szybkością. Spadek wydajności w działaniu i uruchamianiu aplikacji może być zauważalny.

Pamięć wymiany w żaden cudowny sposób nie poszerzy pojemności układu pamięci RAM Twojego telefonu!

Swap polecam przetestować przede wszystkim osobom, które posiadają małą ilość pamięci RAM w komórce, a przy tym wymagają od niej dużej ilości uruchomionych aplikacji na raz, aby bez problemu się między nimi przełączać, a nie co chwilę włączać ponownie. W takim przypadku, mimo zastosowania swapu, czasowo i tak zyskujemy. Spica jest jednym z telefonów, gdzie możemy rozważyć uruchomienie pamięci wymiany, gdyż ~70MB wolnej pamięci dla użytkownika, to stanowczo za mało (przynajmniej w przypadku moich zastosowań; jeżeli tylko dzwonimy i sms-ujemy, sporadycznie przeglądamy Internet, czy raz na jakiś czas uruchamiamy jakąś aplikację, to zapomnijmy o swapie). Jeżeli posiadasz już około 150-200 MB wolnej pamięci, również wstrzymałbym się od swapu.

Dla swapu istnieje bardzo ciekawa alternatywa, nie spowalniająca aż tak systemu, poprzez transfer danych na kartę pamięci – ale o tym, w kolejnych wpisach.

  1. komentarzy 7 dla “Android – swap na karcie pamięci. Warto czy nie?”

  2. Oj, chyba musisz doczytać jak działa swap w systemach unixowych bo to co powyżej to się trochę kupy nie trzyma.
    Żaden system operacyjny nie potrafi „wrócić do aplikacji” bez wcześniejszego przeniesienia jej do RAMu. Nawet Linux.
    System operacyjny nie musi wyswapować całej aplikacji, może (i przeważnie tak to właśnie robi) wyrzucić tylko jej fragmenty. Sam mechanizm swapowania w Androidzie i Linuksie jest identyczny (choćby dlatego, że jest to robione na poziomie kernela).
    W przypadku Androida swap można utworzyć wyłącznie na karcie pamięci.

    By NLJ on Wrz 1, 2011

  3. Chętnie przejrzałbym jakąś lekturę od Ciebie na temat swapu, która by potwierdziła Twoje słowa.

    A co do ostatniego stwierdzenia, to w Androidzie swap możesz wrzucić nawet na partycję pamięci telefonu – co oczywiście wiąże się ze zmianą tablicy partycji. Ba, kto zabrania utworzyć swap w pliku?

    By Kaka' on Wrz 1, 2011

  4. Ode mnie to może lepiej nie(*) ale jak popatrzysz po sieci to na pewno znajdziesz ;o)
    Zacznij od mechanizmu stronicowania oraz zarządzania pamięcią wirtualną.
    Dalej twierdzę, że swap w Androidzie działa identycznie jak w Linuksie. Swapowaniu podlegają strony pamięci a nie aplikacje. Kernel decyduje co i kiedy zrzucić do obszaru swap oraz co i kiedy stamtąd wyciągnąć. Może tam zrzucić strony pamięci również aplikacji działającej „na pierwszym planie” (choćby po to by zrobić trochę miejsca dla aplikacji działającej w tle).

    Przykład z aplikacjami A, B itp ma więcej wspólnego z tzw cyklem życia aplikacji w Androdzie (http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle) niż z mechanizmem swapowania.

    Tak, można zmienić tablicę partycji wewnętrznej pamięci. Nie jest to ani proste ani bezpieczne (w porównaniu do partycjonowania karty SD czy dysku). Co do pliku swapowania… moje doświadczenia zawodowe(*) sprawiły, że zapomniałem zupełnie o tej opcji (w sensie wydajnościowym jest to zwykły strzał w kolano a nawet oba kolana). To jest trochę jak przyklejnie plasterka na otwarte złamanie. Niby pomaga ale to i tak tylko sztukówka.

    Jeszcze pytanko a`propos przyszłego tematu: masz na myśli bindowanie /data/data itp do karty SD? Jeśli tak to niestety nie jest to żadna alterantywa dla swapu =o( Swap to (wirtualne) zwiększenie dostępnej pamięci RAM. Alternatywą dla niego może być tzw compcache (kompresowanie wydzielonej części pamięci w locie). Transfer danych na kartę pamięci nie spowoduje zwiększenia dostępnej pamięci RAM telefonu. Zwiększy się tylko ilość miejsca na partycji /data, którą system może wykorzystać do własnych celów (np cache, dalvik-cache, itp itd). Nic nie stoi na przeszkodzie by jednym skryptem odpalanym z init-a wykonać mount –bind /data/ [SD]/cośtam Kara wydajnościowa będzie w takim wypadku minimalna (aplikacje przeważnie aż tak dużo nie piszą do przydzielonego sobie obszaru w /data/data).

    * – ja tylko administruję uniksami od ponad 15 lat. Żaden ze mnie kernel-hacker =o)

    By NLJ on Wrz 2, 2011

  5. Co do pytania to miałem właśnie na myśli compcache.

    W kwestii swapu w pliku. Osobiście na dwóch maszynach miałem osobne partycje na swap, działało dobrze – bo co miałoby nie działać. Był czas kiedy po prostu brakowało miejsca momentami. Osobny hdd dla kolejnych 2-4 GB opłacalny nie jest, więc postanowiłem przetestować swap w pliku, a tak, aby sobie zmienić rozmiar kiedy chcę. Moje zdziwienie było dość spore gdy nie zauważyłem różnicy czasowej chociażby w przypadku hibernacji, czy zawalania swapu. Niemniej – każdy ma swoje doświadczenia; jedyne sensowne rozwiązane to „porządny” benchmark.

    W kwestii działania swap, po krótkich lekturach Google’owskich, zwracam Tobie honor.

    By Kaka' on Wrz 2, 2011

  6. Compcache nie transferuje danych na kartę. Całość odbywa się wyłącznie w RAMie.

    Plik swapu jest fajny jeśli potrzebujesz na chwilę zwiększyć SWAP (ewentualnie nie ma szans na repartycjonowanie dysku). Na domowym komputerze/małym serwerku różnicy wydajności nie zobaczysz. Na mocno obciążonym serwerze pewna różnica będzie (zapis do pliku swapu podlega normalnym prawom zapisu w filesystemie; zapis do partycji swap odbywa się z pominięciem VFSu).
    Zrzut pamięci w trakcie hibernacji odbywa się sekwencyjnie (zawartość swapu jest blok po bloku nadpisywana) i, choćby tylko dlatego, różnica czasowa będzie niezauważalna.

    By NLJ on Wrz 2, 2011

  7. Wywiązuje się ciekawa dyskusja – aż mi miło :^). Widzę, że masz spore doświadczenie w kwestii swapu, więc jakbyś odniósł się do następującego stwierdzenia:

    „In Linux 2.4 and earlier, swap files are less robust than swap
    devices (partitions) because of the need to read metadata from the
    filesystem for swap files, making them prone to OOM deadlocks when
    allocating pages and buffer_heads to use in swapping.
    This has changed in Linux 2.5. Using a swap file has no disadvantage
    compared to swapping to a device (partition). The kernel doesn’t
    need to allocate any memory to get a swapcache page to disk.”?

    By Kaka' on Wrz 2, 2011

  8. W kwesti swapu nie mam doświadczeń =o) Najlepiej jak systemy nie mają okazji do swapowania.
    Z tego co przytoczyłeś wynika, że mój zarzut wobec swapfile stracił rację bytu i to dość dawno temu =o)

    By NLJ on Wrz 4, 2011

Napisz komentarz