swapovani a linux


Pro lidi, co nemeli cas se prohrabat miliony dokumentu, je tu par tipu o swapovani (budu to psat s jednoduchym v, jesti je to spatne tak mi mailnete).

swapovani a paging je odkladani malo pouzivanych stranek v pameti na disk (O jaka novina). Stranky se vetsinou odkladaji, az kdyz neni fyzicka pamet (na rozdil od nejakeho netbsd kde se to snad dela preventivne). Starsi jadra maji horsi algoritmus swapovani (jadra 1.3.XX kde XX>40 jsou na tom o mnoho lepe s rychlosti).

swapuje se na harddisk, cim rychlejsi, tim lepsi. swapovat muzete na:

Vyhody a nevyhody swapovani jsou u: Linux ma omezeni poctu souboru na swapovani dane v nejakem hadrovem souboru v jadre, standartne to myslim je 128MB/swap{file,partition} a celkem max 8 nebo 16 swap zarizeni. Celkove to ma vychazet na 4GB ;-).


Vytvoreni staticke swap partition:


na vytvoreni partition musite spustit fdisk, vytvorit v nem prislusnou partition a nastavit ji typ na linux swap(pisu vytvorit {n} a nastavit {t}).

smrt:~# fdisk /dev/hdb

Command (m for help): p

Disk /dev/hdb: 64 heads, 63 sectors, 524 cylinders
Units = cylinders of 4032 * 512 bytes

   Device Boot  Begin   Start     End  Blocks   Id  System
/dev/hdb1   *       1       1     178  358816+   6  DOS 16-bit >=32M
/dev/hdb2         179     179     490  628992   83  Linux native
/dev/hdb3         491     491     524   68544   82  Linux swap

Command (m for help): 
Pak musite rebootnout pocitac, pac linux si pro partitions (sakra tak dlouhy slovo by chtelo makro, neznate neco kratsiho?) po startu vytvari staticke tabulky (myslim ze u primarnich partisen to neni zapotrebi). Po startu vam jadro oznami pritomnost uz zaintegrovanych (to jako ze uz je mate v /etc/fstab) swap part. takto:
 17:21:54 smrt kernel: Partition check:
 17:21:54 smrt kernel:  hda: hda1 hda2 hda3
 17:21:54 smrt kernel:  hdb: hdb1 hdb2 hdb3
 17:21:54 smrt kernel:  hdc: hdc1 hdc2
 17:21:54 smrt kernel: VFS: Mounted root (ext2 filesystem) readonly.
 17:21:54 smrt kernel: Adding Swap: 68540k swap-space
 17:21:54 smrt kernel: Adding Swap: 20660k swap-space
Nicmene aby to takhle fungovalo tak musite jeste zavolat mkswap na tyhle vytvorene part., protoze oznaceni ze to jsou ony je v prvnim 4kb bloku na zacatku (aby se vyhnulo katastrofam a zamenam s filesystemy). Tady pozor ! Pokud udelate mkswap /dev/hda tak se muzete dozajista rozloucit se svymi daty, protoze se premazne MBR hadru a jeste neco za tim. Mkswap je zatim hloupej a neumi si zanalyzovat, ze ho posilate spachat harakiri systemu. U starsich verzi systemu (prikazu mkswap nebo jadra) se jeste musela zadavat velikost (to muzete i tak). Takze ted spustite dejme tomu
# mkswap /dev/hdb2
a ono to neco vypise. Od tohoto okamziku muzete prikazem
# swapon /dev/hdb2
aktivovat (zaradit do systemu) tuto part. Lepsi je ale zaradit ji do /etc/fstab , kde se potom pri startu systemu namounti sama prikazem swapon -a (vola se nekde z /etc/rc.d/rc.S ). Ukazka z /etc/fstab :
/dev/hda3        /            ext2        defaults
/dev/hda1        /DOS1        msdos        defaults,user,rw,umask=000
/dev/hdb1        /DOS2        msdos        defaults,user,rw,umask=000 
/dev/hda2	/DISK1		ext2		defaults
/dev/hdb2	/DISK2		ext2	defaults
/dev/scd0       /cdrom        iso9660       ro,user,noauto,exec,umask=000
#/dev/hdd1       /DISK3        ext2        auto,rw,user,exec
#/dev/hdc1       /DISK4        msdos        auto,rw,user
/dev/fd0	/A		msdos		user,noauto,rw,umask=000
/dev/fd1	/B		msdos		user,noauto,rw,umask=000
smejd:/		/SMEJD		nfs		user,noauto
/dev/hdb3	swap	swap	auto
#/DOS1/swapfile	swap	swap	auto
none             /proc    proc        defaults   1   1,umask=066



No a ted swapovani do souboru:


soubor by nemel byt fragmentovany (v anglickem originalu si vzpominam ze je ze nesmi byt, ale tomu neverte), aby se nedegradovala vykonnost dlouhymi presuny hlavy disku. Nejlepe je vytvorit soubor prikazem dd, kteremu reknete kolik bloku (1024 bytu) to ma byt dlouhe. Snad lze dd rici i velikost v MB, ale to jiz nechavam na vas (man dd). Ukazka vytvoreni souboru swapfile v hlavnim adresari disku:
# dd if=/dev/zero of=/swapfile bs=1024 count=10000
pro 10MB soubor. Na tento soubor pak pustite mkswap:
# mkswap /swapfile
No a jeste mu nastavte prava -rw------- aby si nikdo nemohl precist cizi procesy (;-))
# chmod 600 /swapfile
a ted uz zase staci jen zadat
# swapon /swapfile
a je to ok. Pokud chcete automaticky namountit ruzne swapfajly, tak si bud pridejte pro to radku do /etc/rc.d/rc.S, tam kde se vola swapon -a nebo je zaradte do /etc/fstab (priklad vyse /etc/fstab).


Vytvaret swapfile jde i na dosovych discich, a jde dokonce i sdilet windouzovsky swapfile. Ja vas vsak osobne od pouziti swapfile jako jedineho (nebo prvniho) swapovaciho zarizeni zrazuji. Je to totiz silene pomale. Doporucuji udelat si jednu swapovaci part. na pokud mozno co nejrychlejsim disku a pokud mozna na jinem disku a jinem kanalu radice, nez je root filesystem. Proc?
Protoze pri swapovani se vetsinou do pameti natahuje program, ten se nahrava z nejakeho namounteneho filesystemu (vetsinou /), dynamicky se linkuje, a pri tom chce pamet. Takze se vyhazuji nepotrebne stranky ven. No a pokud tohle vsechno jede najednou na jednom jedinem disku, tak se hlavicky muzou zblaznit. Takze je lepsi mit dva disky, jeden pro linux a druhy treba pro dos a na nem jeste mit swap part. pro linux. Pokud jsou tyto disky kazdy na jinem kontroleru (tedy ne fyzicky dva kontrolery, mysleno primarni a sekundarni radic u IDE nebo IDE/SCSI) ktere kazdy pouziva jine IRQ, probiha swapovani hladce. Uplne nejlepsich vykonu lze dosahnout nastavenim unmask irq flagu u disku programem hdparm, nastavenim write cache disku, sector multicount aspon 4 a je to.

Pokud by nekdo mel extra naroky na rychlost swapovani, tak lze pouzitim dvou a vice swappartisen na ruznych discich docilit toho, ze linux bude pouzivat obe najednou a to s pomerem priorit zadanych v /etc/fstab: /dev/hdb1 swap swap defaults,pri=1
/dev/hda2 swap swap defaults,pri=1

Dnes jsou ceny pevnych disku relativne priznive, takze si muzete dovolit obetovat i desitky MB na sw. part. Nicmene z principu se muze stat, ze i tato hranice nebude stacit. Muzete treba delat a otevirat hodne oken a nezavirat je za sebou, coz za chvili tu vasi swapovaci part. zaplni. Budou v ni sice mrtva data (zadne prehazovani RAM-DISK), ale stale bude potreba swap mista. Toto lze resit tak, ze si spustite demona, jez bude sam podle volne pameti pridavat a ubirat 'swapfajly'. Tento demon se jmenuje swapd a uz ani nevim, kde jsem ho vyhrabal ( je na tsx-11.mit.edu). Pracuje tak, ze kazdych n sekund kontroluje (doporucuji 1 nebo 2), zda je volno <dolni hranice> pameti. Pokud ne, tak prida v zadanem adresari soubor o velikosti <co mu pri startu zadate> a ceka, az se velikost volne pameti po eventualnim odebrani posledniho swapfile zvysi na <horni hranice> volne pameti. Tady je lsm toho programu:

Begin3
Title:          swapd
Version:        1.3
Entered-date:   21May95
Description:    swapd is a daemon that will create swap files on the fly to
		cope with peak VM demands.
Keywords:       swap, deamon, VM, /dev
Author:         Nick Holloway 
Maintained-by:  
Primary-site:   tsx-11.mit.edu /pub/linux/sources/sbin
			6751 swapd-1.3.tar.gz
Platform:       Linux
Copying-policy: Freely redistributable
End
Ja ho spoustim z /etc/rc.d/rc.local , ale muze to byt lepsi z /etc/rc.d/rc.S. Vypis rc.local:
#! /bin/sh
# Put any local setup commands in here
# Running gpm
echo Setting volume
/usr/bin/setmixer vol 40
echo "Running gpm..."
gpm -t ms &
#echo NASTAVUJU swapfile
#/sbin/swapon /DOS2/swapfile
echo Nastavuju rychlost klavesnice na 30,250
/sbin/kbdrate -r 30 -d 250
/bin/setserial /dev/ttyS1 spd_vhi
#nastav multiple 32 sektoru, lookahead on a mwordDMA3(16.6)
/sbin/hdparm -S 0 -k 1 -K 1 -a 32 -A 1 -m 32 -u 1 -W 1 -X 34 -Z /dev/hdb
/sbin/hdparm -S 0 -k 1 -K 1 -a 2 -A 1 -m 4 -u 1 -W 0 -X 34 -Z /dev/hda
#  -a 32  - readahead sect count
#green vypinani monitoru
/sbin/green_set ON
#blanking 15 minut
/bin/setterm -blank 15
#start dynamicke swapovani
echo "Adding dynamic swapfile"
/sbin/swapd -d / -i 2 -s 6M -l 4M -u 6M
#cdrom
echo Mounting cdrom under /cdrom
/bin/cdr
#echo Starting httpd
#/usr/sbin/httpd
Vsimnete si v tom bordelu toho prvniho zvyrazneneho - je to relikt z dob, kdy jsem jeste swapoval na dos fat-radoby-filesystem. Bylo to opravdu na umreni.

BTW, existuje prikaz swapoff ktery vypina ("odmontovava") swapy (napriklad volan jako swapoff -a pri shutdownu).

No a uplne na zaver, i kdyz by to melo byt na zacatku, odhady velikosti swapovacich zarizeni. Pokud mate 4MB RAM, tak bude pocitac docela hodne chrastit diskem. Pak neni treba mit vice nez 10-16 MB swapu. Pokud mate 8, pak se da s rozumne rychlym diskem jet i X-windows (ty novejsi jsou trosku tucnejsi :) . Pokud mate 16 MB pameti, tak vam porad doporucuji mit 16-20 MB swap. No a pokud mate 32 MB jako ja a stejny styl prace "okno sem, okno tam, kdypak to asi pozaviram?" tak si tech 70 MB jako ja tady klidne muzete udelat (pravda, jednou jsem jich zaplnil skoro 38 :-) . Jestli mate malo mista, tak bych mozna doporucil udelat staticky swap trosku mensi (mozna polovicni nez tu doporucuji) a k tomu spustit swapd.

Jestli jste si nekdy mysleli "No dneska mam 8MB RAM + 8MB SWAP a zitra si koupim dalsich 8MB RAM, tak ten swap zrusim", tak jste na omylu. To co tu doporucuji pro ruzne vybavene pocitace neberte absolutne. Ne vsichni delaji se svymi milacky totez. Ono totiz jakmile zvetsite pamet v pocitadle, hnedka objevite aplikaci, ktera ji celou sezere a bude chtit jeste vic :)

Pro lidi se sanema (jako manzelkama) co nemaj prachy na ramku:
nove verze jadra (2.0.XXneco) maji moznost zkompilovat ovladace jako moduly (nic noveho) ale maji i demona, ktery tyto ovladace sam za behu pripojuje k jadru jak jsou potreba. To setri velice pamet v pripadech, ze potrebujete obluhovat mnoho ruznych zarizeni, ale ne vsechny najednou (ethernet,ppp,slip,cdrom,ovladace filesystemu etc.).


Zpatky na hlavni stranku