Minnet, jag har tappat mitt minne,
är jag svensk eller finne
kommer inte ihag. . .
(Bosse Österberg)
V této kapitole jsou popsány hlavní rysy systému správy paměti operačního systému Linux, tedy subsystémy virtuální paměti a diskové vyrovnávací paměti (angl. disk buffer cache). Kapitola dále popisuje jejich účel, funkce a další podrobnosti, které správce systému musí vzít v úvahu.
Operační systém Linux podporuje systém virtuální paměti, to znamená, že používá disk jako rozšíření paměti RAM. Tím se efektivní velikost využitelné paměti odpovídajícím způsobem zvětší. Jádro systému zapisuje obsah právě nevyužívaných paměťových bloků na pevný disk a paměť se tak může využívat pro jiné účely. Když pak přijde požadavek na její původní obsah, bloky z disku se načtou zpět do paměti RAM. To vše probíhá z pohledu uživatele zcela transparentně. Programy běžící pod Linuxem si zjišťují pouze velikost dostupné paměti RAM a nestarají se o to, že její část je občas uložená na disku. Přirozeně, čtení a zápis na pevný disk je pomalejší (zhruba o tři řády), než využití reálné paměti, takže programy neběží tak rychle. Část disku, která se využívá jako virtuální paměť, se nazývá odkládací prostor (angl. swap space).
Linux může použít pro "swap" jak normální soubor uložený v souborovém systému, tak zvláštní diskovou oblast. Předností samostatného diskového segmentu je rychlost, výhodou odkládacího souboru je jednodušší možnost změny celkové velikosti odkládacího prostoru. Není přitom totiž potřeba měnit rozdělení celého pevného disku na oblasti, kdy navíc hrozí nutnost kompletní reinstalace systému (při případném nezdaru této operace). Víte-li, jak velký odkládací prostor budete potřebovat, zvolte odkládací prostor na zvláštní oblasti disku. Pokud si nároky na "swap" nejste zcela jisti, zvolte nejdřív odkládací prostor v souboru. Když budete systém nějakou dobu používat, budete schopni odhadnout, kolik odkládacího prostoru skutečně potřebujete. Až budete mít ohledně předpokládané velikosti požadovaného odkládacího prostoru jasno, vytvoříte pro něj zvláštní diskovou oblast.
Měli byste rovněž vědět, že Linux umožňuje využívat současně několik odkládacích oblastí, případně několik odkládacích souborů. Takže když potřebujete pouze příležitostně větší množství odkládacího prostoru, je lepší (místo trvale vyhrazené rezervy) nastavit další soubor pro "swap" navíc.
Poznámka k terminologii používané v oblasti operačních systémů: v odborných kruzích se obvykle rozlišuje mezi odkládáním (angl. swapping), tedy zapsáním celého procesu do odkládacího prostoru na disku, a stránkováním (angl. paging), tedy zapisováním pouhých částí pevné velikosti (obvykle několik kilobajtů) najednou. Stránkování je obecně výkonnější a je to metoda, kterou používá i operační systém Linux. Tradiční terminologie systému Linux ale používá pojem "odkládání" (swapping).
Odkládací soubor (swap) je běžný soubor a není pro jádro systému ničím zvláštní. Jediná vlastnost, která má pro jádro význam, je, že odkládací soubor nemá tzv. "prázdná místa" (angl. holes) a že je připraven pro použití programem mkswap. Musí být navíc (z důvodů implementace) uložený na lokálním disku, takže nemůže být uložen v souborovém systému, který je připojen pomocí NFS.
Zmínka o "dírách" je důležitá. Odkládací soubor si rezervuje určitý diskový prostor, takže jádro systému pak může rychle odložit stránku paměti bez toho, že by muselo absolvovat celou proceduru alokace diskového prostoru, která se používá pro běžný soubor. Jádro využívá pouze ty sektory, které byly pro odkládací soubor vyhrazeny. Protože "prázdné místo" v souboru znamená, že tomuto místu souboru nejsou přiděleny žádné diskové sektory, nebylo by pro jádro systému dobré je využívat.
Jeden ze způsobů, kterým lze vytvořit odkládací soubor bez prázdných míst, je:
$ dd if=/dev/zero of=/extra.swap bs=1024 count=1024
1024+0 records in
1024+0 records out
$
kde /extra.swap je jméno odkládacího souboru, jehož velikost je uvedená za parametrem count=. Ideální je zvolit velikost jako násobek 4, protože jádro systému zapisuje do odkládacího prostoru stránky paměti, které jsou 4 kilobajty velké. Nebude-li velikost násobkem 4, může být poslední pár kilobajtů nevyužitý.
Disková oblast pro "swap" rovněž není ničím neobvyklým. Vytvoří se stejně, jako každá jiná disková oblast. Jediným rozdílem je, že se používá jako "syrové" zařízení, tedy bez souborového systému. Je dobré označit ji jako typ 82 ("Linux swap"). I když to jádro systému striktně nevyžaduje, vnese to do seznamu diskových oblastí řád.
Poté, co byli vytvořeny diskový segment pro odkládací prostor nebo odkládací soubor, je potřeba zapsat na jejich začátek odpovídající označení, které obsahuje některé informace významné z hlediska správy systému a informace, jež využívá jádro systému. Provede se to příkazem mkswap tímto způsobem:
$ mkswap /extra.swap 1024
Setting up swapspace, size = 1044480 bytes
$
Je důležité si uvědomit, že odkládací prostor systém zatím nevyužívá. Sice existuje, ale jádro systému jej jako virtuální paměť zatím nezná.
Při zadávání příkazu mkswap byste měli být velice opatrní, protože program nekontroluje, zda se soubor nebo disková oblast nevyužívá k jiným účelům. Příkazem mkswap proto můžete lehce přepsat důležité soubory nebo celé diskové segmenty! Naštěstí budete tento příkaz potřebovat pouze když instalujete operační systém.
Linuxový manažer paměti omezuje velikost každého z odkládacích prostorů na asi 127 MB (z různých technických důvodů je současný limit (4096-10) x 8 x 4 096=133 890 048 bajtů neboli 127,6875 MB). Avšak současně můžete využívat až 16 odkládacích prostorů, tedy celkem téměř 2 GB.
Využívání nově vytvořeného odkládacího prostoru lze zahájit příkazem swapon. Příkaz sdělí jádru systému, že odkládací prostor, jehož úplná cesta se zadává jako argument příkazu, lze od této chvíle používat. Takže když budete chtít začít využívat dočasný soubor jako odkládací prostor, zadáte tento příkaz:
$ swapon /extra.swap
$
Odkládací prostory lze využívat automaticky poté, co budou zapsány v souboru
/etc/fstab, například:
/dev/hda8 none swap sw 0 0
/swapfile none swap sw 0 0
Spouštěcí skripty vykonávají příkaz swapon .a, jenž zahájí odkládání do všech odkládacích prostorů uvedených v souboru /etc/fstab. Takže příkaz swapon se často používá jenom když je potřeba použít odkládací prostor navíc.
Příkazem free lze monitorovat využívání odkládacích prostorů. Příkaz zobrazí celkové množství odkládacího prostoru, který je v systému využíván:
$ free
total used free shared buffers
Mem: 15152 14896 256 12404 2528
./+ buffers: 12368 2784
Swap: 32452 6684 25768
$
v prvním řádku výstupu (položka Mem:) se zobrazuje velikost fyzické paměti. Sloupec total neukazuje skutečnou velikost fyzické paměti, kterou využívá jádro systému, ta má obvykle asi jeden megabajt. v sloupci used je zobrazeno množství využívané paměti (v druhém řádku chybí údaj o zásobnících vyrovnávací paměti). Sloupec free udává celkové množství nevyužité paměti. Sloupec shared ukazuje paměť sdílenou několika procesy - platí čím více, tím lépe. v sloupci buffers je zobrazena aktuální velikost vyrovnávací diskové paměti.
V posledním řádku (Swap:) jsou analogické informace, jež se týkají odkládacích prostorů. Když jsou v tomto řádku samé nuly, není odkládací prostor systému aktivovaný.
Stejné informace lze získat příkazem top, nebo z údajů v souborovém systému proc, přesněji v souboru /proc/meminfo. Obvykle je ale dost obtížné získat informace o využití jednoho konkrétního odkládacího prostoru.
Odkládací prostor lze vyřadit z činnosti příkazem swapoff. Příkaz pravděpodobně využijete pouze pro vyřazení dočasných odkládacích prostorů. Všechny stránky, které jsou uloženy v odkládacím prostoru, se po zadání příkazu swapoff nejdříve načtou do paměti. Když není dostatek fyzické paměti, do které by se načetly, budou uloženy do některého z jiných odkládacích prostorů. Když není ani dostatek virtuální paměti na odložení všech načítaných stránek odkládacího prostoru, jenž má být vyřazen z činnosti, začnou problémy. Po delší době by se operační systém měl zotavit, ale mezitím bude prakticky nepoužitelný. Proto byste měli předtím, něž vyřadíte některý odkládací prostor z činnosti, zkontrolovat (např. příkazem free), jestli máte dostatek volné paměti.
Všechny odkládací prostory, které se používají automaticky po zadání příkazu swapon -a, lze vyřadit z činnosti příkazem swapoff -a. Příkaz vyřadí z činnosti pouze odkládací prostory uvedené v souboru /etc/fstab. Odkládací prostory přidané ručně zůstanou nadále v činnosti.
Někdy mohou nastat situace, že se využívá příliš mnoho odkládacího prostoru, i když má systém dostatek volné fyzické paměti. Může se to stát například v situaci, kdy jsou v jednom okamžiku velké nároky na virtuální paměť, ale po chvíli je ukončen některý větší proces, který využívá větší část fyzické paměti, a ten paměť uvolní. Odložená data se ale nenačítají do paměti automaticky a zůstanou uložena na disku až do doby, než budou potřeba. Fyzická paměť by tak mohla zůstat dost dlouho volná, nevyužitá. Není potřeba se tím znepokojovat, ale je dobré vědět, co se v systému děje.
Virtuální paměť používá mnoho operačních systémů. Vzhledem k tomu, že každý ze systémů využívá svůj odkládací prostor jenom když běží (tedy nikdy ne několik systémů současně), odkládací prostory ostatních operačních systémů pouze zabírají místo na disku. Pro operační systémy by bylo efektivnější sdílet jediný odkládací prostor. I to je možné, ale je potřeba se tomu trochu více věnovat. V publikaci "Tips - HOWTO" je uvedeno několik praktických rad, jak systém sdílení odkládacího prostoru realizovat.
Možná někdy narazíte na radu, že máte přidělovat dvakrát tolik odkládacího prostoru, než máte fyzické paměti. To je pouhá pověra. Uvádíme proto správný postup:
1. Zkuste odhadnout, jaké jsou vaše celkové potřeby paměti, tedy největší množství paměti, které budete pravděpodobně v jednom okamžiku potřebovat. To je dané součtem paměťových nároků všech programů, které budou (pravděpodobně vždy) běžet současně. Když například chcete, aby běželo grafické uživatelské rozhraní X Window, měli byste mu přidělit asi 8 MB paměti RAM. Kompilátor gcc vyžaduje několik megabajtů (kompilace některých souborů by mohla mít neobvykle velké nároky na paměť, jež by mohly dosáhnout až několika desítek megabajtů, ale běžně by měly stačit zhruba čtyři megabajty).
Jádro samotné bude využívat asi jeden megabajt paměti, běžné interprety příkazů a jiné menší utility několik stovek kilobajtů (řekněme asi jeden megabajt dohromady). Není potřeba být v odhadech úplně přesný, stačí udělat velmi hrubý odhad, ale ten by měl být spíše pesimistický.
Je důležité si uvědomit, že když bude systém současně používat více uživatelů, budou paměť RAM potřebovat všichni. Avšak budou-li současně ten samý program používat dva uživatelé, celková potřeba paměti obvykle nebude dvojnásobná, protože stránky kódu a sdílené knihovny budou v paměti pouze jednou.
Pro správný odhad nároků na paměť jsou užitečné příkazy free a ps.
2. K odhadu podle kroku 1 připočítejte nějakou rezervu. To proto, že odhady paměťových nároků programů budou velmi pravděpodobně nedostatečné - je možné, že na některé aplikace, které budete chtít používat, zapomenete. Takto budete mít jistotu, že pro tento případ máte nějaké to místo navíc. Mělo by stačit pár megabajtů. (Je lepší vyčlenit příliš mnoho, než moc málo odkládacího prostoru. Ale není potřeba to přehánět a alokovat celý disk, protože nevyužitý odkládací prostor zbytečně zabírá místo. V dalších částech této kapitoly bude uvedeno, jak přidat další odkládací prostor.) Vzhledem k tomu, že se lépe počítá s celými čísly, je dobré hodnoty zaokrouhlovat směrem nahoru, řádově na další celé megabajty.
3. Na základě těchto výpočtů budete vědět, kolik paměti budete celkem potřebovat. Takže když odečtete velikost fyzické paměti od celkových nároků na paměť, dozvíte se, kolik odkládacího prostoru musíte celkem vyčlenit. (U některých verzí Unixu se musí vyčlenit i paměťový prostor pro obraz fyzické paměti, to znamená, že velikost paměti vypočítaná podle kroku 2 představuje skutečné nároky na paměť a není třeba odečítat velikost fyzické paměti od celkových nároků na paměťový prostor.)
4. Je-li vypočítaná velikost odkládacího prostoru o hodně větší, než dostupná fyzická paměť (více, než dvakrát), měli byste raději více investovat do fyzické paměti. Jinak bude výkon systému příliš nízký.
Vždy je dobré mít v systému alespoň nějaký odkládací prostor, i když podle výpočtů žádný nepotřebujete. Linux používá odkládací prostor poněkud agresivněji, snaží se mít tolik volné fyzické paměti, kolik je jenom možné. Linux navíc odkládá paměťové stránky, které se nepoužívají, i když se fyzická paměť zatím nevyužívá. Tím se totiž zamezí čekání na případné odkládání - data lze takto odložit dřív, v době, kdy je disk jinak nevyužitý.
Odkládací prostor lze rozdělit mezi několik disků. To může v některých případech zlepšit výkon systému, jenž v tomto směru závisí na relativních rychlostech disků a jejich přístupových modelech. Lze samozřejmě experimentovat s několika variantami, ale mějte vždy na paměti to, že je velmi lehké u takovýchto pokusů pochybit. Neměli byste také věřit tvrzením, že některá z možností je lepší než ostatní, protože to nemusí být vždy pravda.
Čtení z disku je ve srovnání s přístupem k (reálné) paměti velmi pomalé. Navíc se v běžném provozu velmi často z disku načítají stejná data několikrát během relativně krátkých časových intervalů. Například v případě elektronické pošty se nejdříve musí načíst došlá zpráva, když na ni chcete odpovědět, načte se ten samý dopis do editoru, pak stejná data načte i poštovní program, který je kopíruje do souboru s došlou, případně odeslanou poštou a podobně. Zkuste si představit, jak často se může zadávat příkaz ls na systému s mnoha uživateli. Jediným načtením informací z disku a jejich uložením do paměti do doby, než je nebude potřeba, lze zrychlit především operace čtení z disku. Paměť vyhrazená pro tyto účely, tedy pro ukládání z disku načítaných a na disk zapisovaných dat (angl. disk buffering), se nazývá disková vyrovnávací paměť (angl. buffer cache).
Protože paměť je naneštěstí omezený a navíc "vzácný" systémový zdroj, nemůže být vyrovnávací paměť obvykle příliš velká (nemohou v ní být totiž uložena úplně všechna data, která by chtěl někdo používat). Když se vyrovnávací paměť zaplní, data, jež se nepoužívala nejdéle, se odloží na disk a takto uvolněná vyrovnávací paměť se využije na ukládání dalších dat.
Vyrovnávací paměť funguje při zápisu na disk. Jednak proto, že data, která se zapisují na disk, se velmi často brzo opakovaně načítají (např. zdrojový kód je ukládán do souboru a pak jej opět načítá kompilátor), takže je výhodné uložit data zapisovaná na disk i do vyrovnávací paměti. Jednak již pouhým uložením dat do paměti "cache" a tím, že se nezapisují na disk ihned, se zlepší odezva programu, jenž data zapisuje. Zápis dat na disk pak může probíhat na pozadí bez toho, že by se tím zpomalovaly ostatní programy.
Diskové vyrovnávací paměti používá většina operačních systémů (i když je možné, že se jim říká nějak jinak). Ne všechny ale pracují podle výše uvedených principů. Část z nich se označuje jako vyrovnávací paměti s přímým zápisem (angl. write-through). Zapisují data na disk ihned (data přirozeně zůstanou rovněž uložena ve vyrovnávací paměti). Je-li zápis odložen na pozdější dobu, označují se tyto vyrovnávací paměti jako paměti s odloženým zápisem (angl. write-back cache). Posledně uvedený systém je zřejmě efektivnější, než prvně jmenovaný, je ale také o něco více náchylný k chybám. V případě havárie systému, případně výpadku proudu v nevhodném okamžiku, či vytažení diskety z disketové mechaniky předtím, než jsou data čekající ve vyrovnávací paměti na uložení zapsána, se změny uložené ve vyrovnávací paměti obvykle ztratí. Navíc by takováto událost mohla zapříčinit chyby v souborovém systému (je-li na disku či disketě vytvořen), jelikož mezi nezapsanými daty mohou být i důležité změny účetních informací samotného souborového systému.
Proto by se nikdy nemělo vypínat napájení počítače dřív, než správně proběhla procedura zastavení systému (viz kapitola 6). Rovněž by se neměla vytahovat disketa z mechaniky předtím, než byla odpojena příkazem umount (byla-li předtím připojená), případně předtím, než program, jenž přistupoval na disketu, signalizuje, že práci s disketovou mechanikou ukončil a než přestane svítit kontrolní dioda LED mechaniky pružného disku. Příkaz sync vyprázdní vyrovnávací paměť, tedy uloží všechna nezapsaná data na disk. Lze jej použít vždy, když si nejste zcela jisti, jestli se obsah vyrovnávací paměti bezpečně uložil na disk. V tradičních systémech Unix existuje program update, který běží na pozadí a spouští příkaz sync každých 30 sekund. V těchto systémech obvykle není potřeba příkaz sync používat ručně. V systému Linux běží další démon bdflush, jenž dělá něco podobného jako program sync, ale častěji a ne v takovém rozsahu. Navíc se tímto způsobem vyhnete náhlému "zamrznutí" systému, které může někdy příkaz sync při větším rozsahu vstupně-výstupních operací způsobit.
V systému Linux se program bdflush spouští příkazem update. V případě, že je démon bdflush z jakéhokoliv důvodu neočekávaně ukončen, jádro systému o tom podá varovné hlášení. Obvykle ale není důvod se toho obávat. Proces bdflush lze spustit ručně (příkazem /sbin/update).
Ve skutečnosti se obvykle do vyrovnávací paměti neukládají soubory, ale bloky, což jsou nejmenší jednotky při vstupně-výstupních diskových operacích (v Linuxu mají nejčistěji velikost 1 kB). Tímto způsobem se do vyrovnávací paměti ukládají i adresáře, superbloky, další účetní data souborového systému a data z disků bez souborových systémů.
O efektivitě vyrovnávací paměti prvotně rozhoduje její velikost. Malá vyrovnávací paměť je téměř nepoužitelná. Bude v ní uloženo tak málo dat, že se vyrovnávací paměť vždy vyprázdní předtím, než mohou být data použita. Kritická velikost záleží na tom, jaké množství dat se z disků čte a na disky zapisuje a jak často se k těmto údajům přistupuje. Jediným způsobem jak to zjistit, je experimentovat.
Má-li vyrovnávací paměť pevnou velikost, není výhodné ji mít příliš velkou. To by mohlo kriticky zmenšit dostupnou paměť a zapříčinit časté odkládání (jež je navíc velmi pomalé). Aby byla reálná paměť využívána co nejefektivněji, Linux automaticky využívá veškerou volnou paměť RAM jako vyrovnávací paměť. Naopak, operační systém vyrovnávací paměť automaticky zmenšuje, když běžící programy požadují víc fyzické paměti.
V systému Linux není potřeba dělat nic zvláštního pro to, aby bylo možné vyrovnávací paměť využívat. Systém ji totiž používá zcela automaticky. Kromě správného postupu při zastavení systému a vyjímání disket z mechaniky se prakticky o vyrovnávací paměť vůbec nemusíte starat.