Linux swap space mini-HOWTO http://www.xenotime.net/linux/doc/swap-mini-howto.txt Wersje: 2002-10-25, 2002-11-01,04,07,08,10,11,12,17 Randy Dunlap =========================================================================== Copyright (c) 2002 by Randy Dunlap Dokument ten może być rozpowszechniany wyłącznie na zasadach licencji LDPL (Linux Documentation Project License) dostępnej pod adresem http://www.tldp.org/COPYRIGHT.html 1. Wprowadzenie Linux używa przestrzeni wymiany jako dodatkowego obszaru dla stron pamięci aplikacji, które nie są aktywnie używane przez aplikację, jednakże były zmodyfikowane (zapisano do nich). Suma rozmiarów przestrzeni wymiany oraz fizycznej pamięci RAM tworzy ogólną pojemność pamięci wirtualnej systemu. Gdy większość prawdziwej pamięci systemu jest w użyciu i istnieje potrzeba na większe jej zajęcie, część danych zostanie przeniesiona do przestrzeni wymiany, aby w pamięci fizycznej zwolnić miejsce dla aplikacji lub użytku przez jądro, np. dla buforów sterowników, plików lub pakietów sieciowych. Określa się to mianem wyswapowywania (wymiany). Gdy zachodzi potrzeba ponownego użycia danych z przestrzeni wymiany, są one przenoszone z powrotem do pamięci fizycznej. Prędkość z jaką dane są wymieniane może być monitorowana przy użyciu komendy 'vmstat' (kolumna ,,si'' dla transferów do pamięci fizycznej, ,,so'' dla transferów z RAMu). Wszystko to jest uaktywniane przez wysokie zapotrzebowanie na pamięć. Może to oznaczać uruchamianie wielu/dużych programów, ale nawet operacje wejścia/wyjścia (w sieci i na plikach) wymagają alokowania pamięci i mogą powodować aktywne czyszczenie pamięci przez kernel, co może objawiać się wyrzucaniem danych do przestrzeni wymiany. Kod i dane jądre nie podlegają wymianie, tym samym nigdy nie są przenoszone do przestrzeni wymiany. Kod przestrzeni użytkownika nie musi być przenoszony do przestrzeni wymiany, gdyż już znajduje się na dysku i gdy zachodzi potrzeba może zostać ponownie odczytany ze swojego oryginalnego źródła. Dane przestrzeni użytkownika mogą zostać zapisane w przestrzeni wymiany i samtąd odczytane w razie potrzeby. Istnieje alternatywa dla statycznie alokowanej przestrzeni wymiany, jest nią ,,swapd'' - ,,dynamic swapping manager for Linux''. ( URL::http://ftp.linux.hr/pub/swapd/ ). Jedna osoba twierdzi, że używa wyłącznie swapd na kilku systemach linuksowych, bez użycia statycznej przestrzeni wymiany. Twierdzi, że pracuje to stabilnie, prawie nie zużywając przy tym zasobów. Dostosowanie swapd odbywa się przez edycję pliku ,,swapd.conf''. Przykładowa zawartość tego pliku: memlimit 131072 pause 10000 swapsize 65536 timeout 8640 2. Jakiej wielkości przestrzeni wymiany użyć? Trudno powiedzieć. Jeśli Twój system (i programy) zużywa dużo pamięci (więcej niż wielkość fizycznej pamięci w Twoim systemie), to potrzebujesz dużej przestrzeni wymiany. Oczywiście możesz zdecydować, że twój system nie powinien obsługiwać (używać) przestrzeni wymiany, albo ze względu na wydajność, albo na to, że nie posiadasz żadnego [szybkiego] nośnika dostępnego dla tejże przestrzeni, albo ze względu na to, że Twój system posiada tak dużo RAMu, że nigdy nie zostanie on zapełniony, więc nie będzie potrzebował wymieniać danych. Typowo, całkowity rozmiar przestrzeni wymiany równy jest wielkości pamięci RAM Twojego systemu. Wczesne wersje Linuksa 2.4 (aż do 2.4.9) lubiły gdy przestrzeń wymiany miała rozmiar 2x większy od rozmiaru pamięci fizycznej, ale to już nie ma znaczenia. Jedną wadą stosowania zbyt dużej przestrzeni wymiany jest to, że błędne programy mogą pracować przez dłuższy czas i zużyć RAM i przestrzeń wymiany. Prawdopodobnie powoduje to spowolnienie systemu z powodu bardzo intensywnego swapowania i może prowadzić do zabijania nieodpowiednich procesów przez OOM killer, gdy wyczerpie się pamięć (patrz poniżej, sekcja ,,OOM killer''). Można temu zapobiec nie definiując wielkiej przestrzeni wymiany, jeśli nie jesteś pewien, że jest ona wymagana. Innymi słowy, przestrzeń wymiany może być przyczyną spowolnienia systemu, więc przydzielaj ją mądrze. Zużycie przestrzeni wymiany może być monitorowane przy użyciu komendy 'free' lub poprzez czytanie plików /proc/swaps oraz /proc/meminfo Programy instalacyjne większości dystrybucji linuksa rozsądnie przydzielają przestrzeń wymiany dla małych i średnich systemów. 3. Ograniczenia przestrzeni wymiany Linux 2.4.10 (i późniejsze), oraz 2.5 obsługuje do 32 plików lub urządzeń wymiany. Przed jądrem 2.4.10 limit ten wynosił 8. Na systemach o architekturze x86 każdy z tych obszarów wymiany ma limit wielkości do 2 GiB. 4. OOM (Out-of-Memory) killer Jeśli podsystem pamięci wirtualnej linuksa nie może znaleźć pamięci do przydzielenia, umieszcza stronice danych użytkownika w kolejce do wymiany. Jeśli nie może zarówno znaleźć pamięci, jak i wymienić aktualnie używanej pamięci, Out-of-memory killer może zacząć zabijać aktualnie pracujące w przestrzeni użytkownika procesy. Uzasadnienie zabijania z powodu braku pamięci opisane jest w dokumentacji podsystemu zarządzania pamięcią [2]. 5. Ustawianie przestrzeni wymiany Zarządzanie przestrzenią wymiany w Linuksie jest bardzo łatwe i elastyczne. Linuksowe przestrzenie wymiany mogą być włączane i wyłączane bez restartowania systemu, a nawet gdy są używane. Przestrzeni wymiany może zostać przydzielona oddzielna partycja (być może bezpieczniejsze) lub pliki w normalnym systemie plików. Również Woluminy Logiczne (LVM) mogą zostać użyte jako urządzenia wymiany. Istnieją dwa rodzaje (formaty) przestrzeni wymiany obsługiwane przez jądro 2.1 (rozwojowe) i późniejsze (do 2.4). Linux 2.0 wymaga wymaga przestrzeni wymiany w wersji 0 (zero). 2.1.117 i późniejsze obsługują zarówno wersję 0 i 1. Linux 2.5 obsługuje wyłącznie wersję 1. Program 'mkswap' potrafi stworzyć przestrzeń wymiany w obu formatach. Szczegóły w 'man mkswap'. Aby użyć pliku dla przestrzeni wymiany, wybierz jej rozmiar (max. 2GiB na x86) i wpisz (jak to opisano w 'man mkswap'): dd bs=1024 count=1M if=/dev/zero of=/ścieżka/plik_wymiany.n To zapisze jednogigabajtowy plik (1 MiB * 1024 bajty) "/ścieżka/plik_wymiany.n". Możesz wykonać to kilka razy, aby użyć więcej plików wymiany na systemach z dużą ilością pamięci. Pliki wymiany nie mogą być rzadkie (sparse); muszą być w pełni zaalokowane przed użyciem. Oczywiście możesz również umieścić przestrzeń wymiany na jej własnej partycji/partycjach. To zwykle wymaga odrobinę więcej planowania rozdzielania przestrzeni dyskowej. Przestrzeń wymiany umieszczona na osobnej partycji definiowana jest w pliku /etc/fstab ('man 5 fstab'). Przestrzeniom wymiany można przydzielać rózne priorytety ('man 2 swapon'), które wpływają na ich użycie. Przestrzeń wymiany z wyższym priorytetem zostanie zapełniona pierwsza, przestrzenie o równych priorytetach będą przeplatane. Priorytet może zostać ustalony podczas aktywacji przestrzeni wymiany przy użyciu komendy 'swapon' lub przez wpis w pliku '/etc/fstab'. Na przykład: # przestrzeń wymiany na partycjach /dev/hda2 none swap pri=5,defaults 0 0 /dev/hdb1 none swap pri=5,defaults 0 0 # przestrzeń wymiany w plikach /work/swapfile.1 none swap pri=5,defaults 0 0 /work/swapfile.2 none swap pri=5,defaults 0 0 Po przydzieleniu miejsca przestrzeni wymiany musi ona zostać sfromatowana (zainicjalizowana) przez umieszczenie na niej odpowiedniego nagłówka. Wystarczy wykonać to raz. mkswap /dev/hda2 mkswap /dev/hdb1 mkswap /work/swapfile.1 mkswap /work/swapfile.2 Przestrzeń wymiany aktywowana jest podczas startu systemu przez uruchomienie 'swapon' ('man swapon'). Dotyczy to również przestrzeni wymiany w systemie plików, jeśli tylko system plików został już zamontowany. Jeśli dodajesz przestrzeń wymiany po starcie systemu, możesz użyć komendy 'swapon', aby ją aktywować. Na przykład: swapon /dev/hdf1 swapon /work/swapfile.3 Użycie kilku partycji i/lub plików wymiany na różnych dyskach daje efekt przeplatania zapisu między dyski, podobnie jak w RAID-0. Generalnie dobrym pomysłem jest posiadanie kilku przestrzeni wymiany (o tym samym priorytecie) gdy masz kilka urządzeń na niezależnych kanałach. Pozwala to kernelowi na równoległe swapowanie. Dobrym pomysłem może być również trzymanie przestrzeni wymiany na mniej używanych urządzeniach/kanałach, aby intensywne, nie związane z wymianą, wejście/wyjście nie było blokowane przez I/O wymiany. W Linuksie 2.4 i wcześniejszych pliki wymiany są mniej odporne od urządzeń (partycji) z powodu konieczności czytania metadanych z systemu plików, co czyni je podatnymi na zakleszczenie z powodu braku pamięci przy alokowaniu stronic i buforów używanych przy wymianie. To zmieniło się w Linuksie 2.5. Używanie plików wymiany nie ma żadnych wad w porównaniu do urządzeń (partycji). Jądro nie musi zajmować pamięci aby przerzucić bufor na dysk. Jest to interesujące ponieważ pliki wymiany są dużo łatwiejsze w administracji (dodawaniu, usuwaniu, zmianie rozmiaru) i łatwiejsze do przeplatania. Możliwe jesst teraz zupełne wyeliminowanie urządzeń (partycji) wymiany bez utraty wydajności. Jeśli masz dwa dyski, to bardzo rozsądnym rozwiązaniem jest utworzenie pliku wymiany na obu i zrobienie między nimi przeplotu z równym priorytetem. To da najlepszą wydajność I/O, jednakże może spowodować dodatkowe szukanie między przestrzenią wymiany a zwykłymi plikami. Wydzielenie całego dysku na swap oczywiście ograniczy problem szukania. Ale jeśli Twój program jest zależny od wydajności przestrzeni wymiany, potrzebujesz większej ilości pamięci RAM. Swap powinien być traktowany raczej jako prosta i niedroga drugoplanowa optymalizacja, umożliwienie udostępnienia nieużywanych stronic innym procesom, niż lekarstwo dla niedoposażonej maszyny. 6. Wyłączanie przestrzeni wymiany Przestrzeń wymiany jest zwykle deaktywowana przy zamykaniu systemu poprzez użycie komendy 'swapoff' ('man swapoff'). swapoff /work/swapfile.1 swapoff /work/swapfile.2 swapoff /dev/hdb1 swapoff /dev/hda2 Lub przez użycie 'swapoff -a', co wyłącza wszystkie partycje wymiany zdefiniowane w pliku /etc/fstab (Nie odnosi się to do plików wymiany, wyłącznie do partycji). 7. Inne przypadki użycia Przestrzeń wymiany używana jest przez tymczasowy system plików 'tmpfs' jako zapasowa przestrzeń gdy zużycie buforów dyskowych musi zostać zredukowane. Tmpfs pozwala również na ustalenie limitu wielkości. Zobacz dokumentację w drzewie źródeł kernela w pliku 'linux/Documentation/filesystems/tmpfs.txt'. tmpfs używany jest również do wspierania ,,shmfs''. shmfs jest systemem plików używanym do realizacji współdzielonej pamięci POSIX. glibc 2.2 i poźniejsze oczekują, aby tmpfs był zamontowany jako /dev/shm przy wołaniu shm_open() i shm_unlink() dla współdzielonej pamięci POSIX. Zarówno w przypadku tmpfs i shmfs prawdopodobnie chcesz ograniczyć ich maksymalną wielkość. Użyj w tym celu opcji montowania 'size=xxxM'. Na przykład, w /etc/fstab: tmpfs /tmp tmpfs size=750M,mode=2777 0 0 shmfs /dev/shm tmpfs defaults 0 0 Urządzenia (partycje) wymiany mogą również zostać użyte przy software'owym uśpieniu (swsup) w Linuksie 2.5 oraz jako przestrzeń do zapisu zrzutu przy awarii jądra w wersjach, które tą funkcjonalność obsługują. Używanie pliku/ów wymiany pozwala również dzielić przestrzeń wymiany z innymi systemami operacyjnymi, jak to opisano w Linux Swap Space Mini-HOWTO [3] i na liście dyskusyjnej linux-kernel [4]. Podziękowania: Dziękuję wszystkim, którzy skomentowali wczesne wersje tego mini HOWTO, włączając (ale nie ograniczając do): Andries Brouwer, Bernd Eckenfels, Mark Hahn, Troels Walsted Hansen, Dave Jones, Pavel Machek, Andrew Morton, Vince Mulhollon, Wladimir Mutel, Ha Shao, Shane Shrybman oraz Ed Tomlison. Niektóre z ich komentarzy zostały tutaj użyte lub zacytowane. Tłumaczenia: Oryginalna, angielska wersja tego mini-HOWTO dostępna jest pod adresem: ,,http://www.xenotime.net/linux/swap-mini-howto.txt'' Tłumaczenie węgierskie wykonane przez Gabor Micsko: ,,http://www.hup.hu/modules.php?name=News&file=article&sid=1976'' Polskie, wykonane przez Jacka Politowskiego: ,,http://jacek.rallypl.eu.org/tlumaczenia/swap-mini-howto.txt'' Odnośniki: 1. Joe Knapka, ,,Outline of the Linux Memory Management System''. URL::http://home.earthlink.net/~jknapka/linux-mm/vmoutline.html 2. Rik van Riel: ,,Linux-MM docs: the OOM killer'' URL::http://linux-mm.org/docs/oom-killer.shtml 3. Swap-Space, Linux Swap Space Mini-HOWTO. Zaktualizowane: Lipiec 2002. How to share your Linux swap partitions with Windows. URL::http://www.tldp.org/HOWTO/mini/Swap-Space.html 4. URL::http://marc.theaimsgroup.com/?l=linux-kernel&m=103623636324081&w=2 =========================================================================== Od tłumacza: Tłumaczenie: Jacek Politowski Data: 3.11.2002 Ostatnia aktualizacja: 11.02.2003 Zapewne nie jest to wersja finalna - co najmniej z kilku fragmentów nie jestem zadowolony i postaram się jakoś je ,,wygładzić''. A w szczególności nie jestem zadowolony z okolic tmpfs i shm, więc jeśli masz jakieś sugestie, to pisz śmiało. ### koniec ###