Swap terület mini-HOWTO

A HupWiki-ből...

Tartalomjegyzék

Linux terület mini-HOWTO

Randy Dunlap rddunlap@osdl.org
2002. október. 25, november. 01, november. 04
Micskó Gábor trey@hup.hu
2002. november. 03, november. 05

==========================================
Copyright (c) 2002 by Randy Dunlap
Copyright (c) 2002 by Micskó Gábor

Ez a dokumentum az LDPL (Linux Documentation Project License LINUX DOCUMENTATION PROJECT LICENSE) feltételeivel terjeszthető.

Bevezetés

A Linux swap területet használ arra, hogy ki/vissza lapozza a "user space" adatokat akkor, ha virtuális memória terület kényszer alatt áll. A kernel kód és adat nem lapozható. A felhasználói kódot nem szükséges kilapozni a swap területre, mert azt mindig az eredeti helyéről kell olvasni. (nem lesz "szennyezett" - eredeti dokumentumban "dirty")

Mennyi swap területet kell használni?

Ezt nehéz megmondani. Ha a rendszered (és a programjaid) több memóriát használnak, mint amennyi a fizikai memóriád (RAM), akkor swap területre van szükséged. Általában elmondható, hogy annyi virtuális memóriát kell használnod, amennyi a fizikai memóriád (RAM) mérete. A Linux korábbi verzióiban (2.4-es verziókig - egészen a 2.4.9-ig) a fizikai RAM kétszerese volt az általános nézet (2* rendszer RAM mérete).

Természetesen dönthetsz úgy is, hogy nem használsz virtuális memóriát a rendszereden, mert teljesítmény csökkentő hatású, mert nincs elegendően (gyors) adattároló eszközöd amelyre lapozhatnál, vagy csak elegendően nagy fizikai memóriád van, amely soha nem lesz kihasználva teljesen, így a rendszered soha nem fog swappelni.

A swap terület kihasználtságát a 'free' parancs kiadásával, vagy a /proc/swaps vagy /proc/meminfo olvasásával tudod ellenőrizni.

A legtöbb Linux disztribúció telepítőprogramja - érthető módon - allokál swap területet a kis és közepes rendszereken.

A swap terület korlátai

A Linux 2.4.10 (és a későbbiek) és 2.5 kernel 32 swapfilet és/vagy swap eszközt támogat. A Linux 2.4.10-ig a swap eszközök/fileok száma 8 volt. Az x86 architektúrájú rendszereknél ezek a swap fileok vagy partíciók maximum 2GB méretűek lehetnek.

A blokkok méretét a swap területen a CPU architektúra oldal mérete (page size) határozza meg.

OOM (Out-of-Memory) killer

Ha a Linux VM nem talál szükség esetén allokálható memóriát, akkor elkezdi "kitenni" a használatban levő felhasználói adat oldalakat a swap-out queue-be, amelyet majd onnan ki fog lapozni.

Ha a VM nem tud memóriát allokálni, és nem tudja kilapozni a használatban levő memóriát, akkor a Out-of-memory killer elkezdi "megölni" a user-space processzeket. Az OOM működése pontosan le van írva a [2]-ben.

Swap terület beállítása

Swap területet allokálhatunk saját különálló partíción (biztonságosabb), vagy fileon egy meglevő filerendszeren.

Kettő (2) swap terület formátumot támogat a Linux kernel a Linux 2.1 fejlesztői kerneltől kezdve (egészen a 2.5-ig). Linux 2.0 a "verzió 0" swap területet igényli. A Linux 2.1.117 és későbbiek már támogatják a "verzió 0" és a "verzió 1" swap területet. Az 'mkswap' képes mindegyik formátum létrehozására. Nézd meg a 'man mkswap'-ot a bővebb információért.

Ahhoz, hogy swap területet fileon használjunk, meg kell határoznunk a méretét (max. 2 GB x86 rendszeren), és az alábbiakat kell végrehajtanunk (mint ahogy le van írva a 'man mkswap' -ban):

dd bs=1024 count=1M if=/dev/zero of=/path/to/swapfile.n

Ez a parancs egy 1GB-os filet (1 MB * 1024 bytes) hoz létre a "/path/to/swapfile.n"-on. Ezt meg tudod csinálni többször is, ha több swap filet akarsz használni (maxium 32 darab). A swap fileok nem lehetnek elszórtan; az egészet allokálni kell a használat előtt.

Természetesen tudsz allokálni swap területet meglevő partíció(i)don is. Ez egy kis előzetes tervezést igényel még a merevlemez felosztása (partícionálás) során. A swap terület, amely partición foglal helyet, be van jegyezve a /etc/fstab fileba ('man 5 fstab').

Például:

/dev/hda2 none swap defaults 0 0
/dev/hdb1 none swap defaults 0 0

Sőt több merevlemez esetén akár raidet is érdemes beállítani rá, és nagyon egyszerű! Nincs szükség az mkraid parancs, raidtab ... használtára. Swap partició esetén a sebesség számít, az adatbiztonság egyáltalán nem, így csak a csíkozás jöhet szóba.

Az előző /etc/fstab részlet így módosul:

/dev/hda2 none swap defaults,pri=1 0 0
/dev/hdb1 none swap defaults,pri=1 0 0

Már kész is a csíkozás. Így elvileg kétszeres sebességet érünk el (persze ez nagyban függ a vincseszterek kihasználtságától és sebességétől).

Miután a swap terület allokálva van, meg kell formázni (inicializálni), swap header információval kell ellátni. Ezt csak egyszer kell elvégezni:

mkswap /dev/hda2
mkswap /dev/hdb1
mkswap /work/swapfile.1
mkswap /work/swapfile.2

A partícion levő swap terület a boot folyamat init részében aktiválódik a "swapon" ('man swapon') parancs hatására. A swap területet, amely filerendszeren helyezkedik el, szükséges engedélyezni. Erre célszerű egy init szkriptet írni (ha a disztribúciód azon kis hányadhoz tartozik, ami nem kezeli automatikusan az ilyen állományokat):

$! /bin/bash
swapon /work/swapfile.1
swapon /work/swapfile.2

Használható a 'swapon -a' is, ez az fstabból veszi az aktiválandó swap típusú állományokat (ha nincs "noauto" paraméter megadva).

A Linux 2.4-ben és a korábbi verziókban a swap fileok használata kevésbé volt robosztus, mint a swap eszközök (partíciók) használata, mert ebben az esetben fel kellett olvasni a metadata információkat a filerendszerről, és ez gyakran az OOM killer elhasalásához vezetett (deadlock) amikor az oldalakat (pages) és buffer_head-eket allokált a swap közben. Ez megváltozott a Linux 2.5-ben. A 2.5-ben a swap fileok használata semmilyen hátrányt nem okoz, összehasonlítva a swap eszközökkel (partíciókkal). A kernelnek nem kell memóriát allokálnia ahhoz, hogy a swapcache oldalt megkapja a diszktől.

Ez érdekes lehet, hiszen a swap fileokat könnyebben lehet kezelni mint a partíciókat, (könnyebb létrehozni, törölni, átméretezni), és könnyebb csíkozni (stripe). Lehetséges, hogy ez (swap file) fel fogja váltani a swap partíciót a Linux 2.6-ban. A lényeg: a swap fileok használata semmilyen negatív hatással nincs a teljesítményre, összehasonlítva a swap eszközökkel (partíciókkal).

Ha van két lemezed, akkor célszerű a swap fileokat mindegyiken elhelyezni, és egyenlő prioritású csíkozást beállítani közöttük. Ez adja a legjobb raw swap I/O átviteli sebességet, viszont ez több seek-elést (keresés a hdd mechanika által) okoz a swap és a rendes fileok között.

Csökkenthetjük a seek-elési problémát, ha egy egész diszk területet kinevezünk swap eszköznek.

Igazából, ha a használt alkalmazásod már kárát látja a swap teljesíményének (túl sokat swappel) akkor több RAM-ra van szükséged.

Swap terület kikapcsolása

A swap területet ki lehet kapcsolni, ha nincs rá szükség. A swap terület kikapcsol, ha a rendszer leáll/újraindul a 'swapoff' parancs ('man swapoff') hatására.

swapoff /work/swapfile.1
swapoff /work/swapfile.2
swapoff /dev/hdb1
swapoff /dev/hda2

A 'swapoff' helyett használhatjuk a 'swapoff -a' parancsot, amely kikapcsolja az összes swap partíciót, amely be van jegyezve a /etc/fstab fileba (ez nem vonatkozik a swap fileokra, csak a swap partíciókra).

A swap terület egyéb felhasználásai

A swap eszközök (partíciók) használhatóak még az ún. "software suspend"-re (swsusp) (szoftveres hibernáció) a Linux 2.5-ben, és használható a Linux kernel összeomlása esetén, mint dump terület, hova a kernel dumpokat el lehet menteni. A swap területet fel lehet használni arra is, hogy megosztott swap területe legyen más OS-eknek is [3] [4].

Biztonságos swap

A swap terület értékes adatokat is tartalmazhat (pld. dokumentumok), ezért egész paranoid hozzállással érdemes wipeolni (visszahozhatatlanul törölni) a tartalmát. Az eljárás lényege, hogy mikor már a rendszernek nincs szükség a swapre (mert leáll vagy újraindul), akkor lekapcsoljuk és felülírjuk a tartalmát véletlenszerű adatokkal.

#!/bin/sh
swapoff /path/to/swapfile.n
dd bs=1024 count=1M if=/dev/random of=/path/to/swapfile.n
mkswap /path/to/swapfile.n

Természetesen a "count" mennyisége egyezzen a swap méretével.

Ezt a parancssort egy init scriptbe kell tenni, ami init 0-ás (leállítás) és 6-os (újraindítás) szinten fut le. A technológia egyetlen hátulütője, hogy a rendszertől függően hosszabb-rövidebb időbe telik.

CREDITS

Köszönet mindenkinek, aki hozzászólt ehhez a mini-HOWTO-hoz a kezdeti szakaszán, többek között: Andries Brouwer, Bernd Eckenfels, Troels Walsted Hansen, Dave Jones, Pavel Machek, és Andrew Morton. Az Ő hozzászólásuk közül néhány idézve van a dokumentumban.

Fordítások

Az eredeti angol verzió elérhető: "http://www.xenotime.net/linux/swap-mini-howto.txt".

A magyar fordítást megtalálod: "http://www.hup.hu/modules.php?name=News&file=article&sid=1976".

Az lengyel fordítás itt (volt) elérhető: "http://jacek.rallypl.eu.org/translations/swap-mini-howto.txt".

Referenciák

[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.php

[3] Swap-Space, Linux Swap Space Mini-HOWTO.

Frissítve: 2002. július
How to share your Linux swap partition with Windows.
URL: http://www.tldp.org/HOWTO/mini/Swap-Space.html

[4] URL: http://marc.theaimsgroup.com/?l=linux-kernel&m=10362363632408