Portál AbcLinuxu, 1. května 2025 04:53
Doušek teorie, od každého trochu, ničemu neuškodí. Dnes si odhalíme nějaké aktuální informace o mdadm, diskových aj. cache a implementaci bariér v Linuxu.
Když chceme migrovat systém na pole, tak co použít? LVM s funkcí RAID1, nebo klasické pole pomocí mdadm? Záleží na tom, co od čeho člověk očekává. Pokud chceme jen data stripovat (RAID0), tak můžeme s klidem využít LVM.
Nejčastějším případem pole je ovšem RAID1, na který budeme v článku migrovat. Ještě relativně nedávno nemělo LVM kompletně implemetované write bariéry, což v případě výpadku proudu mohlo u žurnálovacíh fs přinést nemilé překvapení (nebo menší výkon). Od jádra 2.6.33 by je mělo již mít plně implementované.
Nicméně, stále tu máme lehkou nevýhodu v tom, jak se chová LVM k disku, jenž nějakým způsobem zlobí (vadné bloky, notifikace apod.). Dále LVM podporuje jen RAID0 a RAID1. Nejlepší je, vydat se ověřenou třívrstvou cestou. Tedy udělat si pole pomocí mdadm, na něm LVM oddíly a ty pak naformátovat na nějaký FS.
Zmínili jsme se o bariérách, co to vlastně je? Write bariéry umožňují využívat diskové cache (a obecně cache) bez rizika poškození souborového systému. Write bariéry je vhodné kvůli lepšímu výkonu používat jen v případě, že cache nemáme zálohovanou baterií (viz BBWC – Battery Backed Write Cache moduly pro řadiče apod.), protože dosáhneme lepšího výkonu než bez použítí cache. Zároveň ale dosáhneme menšího výkonu, než kdybychom používali cache bez write barirér (v případě, že máme cache zálohovanou baterií se nemusíme o nevyřešené zápisy bát a tak nám jsou write bariéry zbytečnou přítěží).
Jednoduchý souhrn doporučení:
cache off, battery off => barriers off
cache on, battery off => barriers on
cache on, battery on => barriers off
Záznamy o bariérách je možné vidět třeba v dmesg :
dmesg |grep barrier [ 2.372547] reiserfs: using flush barriers [ 12.331953] reiserfs: enabling write barrier flush mode [ 12.423573] reiserfs: using flush barriers [ 55.781925] reiserfs: using flush barriers
Jak je to s tou cache?
Každý disk má cache. Každý lepší řadič má také svou cache. Když připojíme disk k řadiči, který má cache, tak řadič automaticky deaktivuje cache na disku a používá se ta na řadiči, kterou lze zabezpečit baterií (BBWC) a bývá také mnohem větší (512 MiB, 1 GiB, 2 GiB apod.).
Ruční zapnutí a vypnutí cache na disku se provádí pomocí programu hdparm:
# info o cache na disku: hdparm -W /dev/sda # zapnutí cache: hdparm -W1 /dev/sda # vypnutí cache: hdparm -W0 /dev/sda
Pokud jde o cache na řadiči, tak to funguje většinou tak, že pokud není dostupná zálohovací baterie (BBWC modul), nebo není baterie úplně nabitá, tak se cache automaticky vypne a nedovolí zapnutí (záleží na řadiči a konkrétním firmware). Taktéž umožňují řadiče cache optimalizovat pro zápis nebo pro čtení. Máme tedy 100 % cache a podle využití stroje můžeme věnovat třeba 70 % pro čtení a 30 % pro zápis.
Zapnutí/vypnutí bariér u jednotlivých FS:
# ext3 on/off: mount -t ext3 -o barrier=1 /dev/sda1 /mnt/disk mount -t ext3 -o barrier=0 /dev/sda1 /mnt/disk # ext4 on/off: -o barrier=1 / -o barrier -o barrier=0 / -o nobarrier # xfs on/off: -o barrier -o nobarrier # reiserfs on/off: -o barrier=flush -o barrier=none # btrfs: -o nobarrier # více v parametrech připojování u konkrétních fs popsaných v: man mount
Řešíme tu bariéry, ale ve skutečnosti je řešit nemusíme. Když dochází k připojení FS, tak ten sám provádí několik testů, a když se mu něco nelíbí, tak si bariéry vypne. Na druhou stranu je dobré vědět, co se děje .
Bariéry byly přidány do linuxu 2.6.16, vizte Documentation/block/barrier.txt a zápisek „Understanding Linux block IO barriers“.
Mít swap na poli, nebo mít na každém disku jen oddíl se swapem a mít dva záznamy pro swap v /etc/fstab a pro každý swap definován pri=1? Co vlastně dělá pri=1?
Dost často se člověk mohl na internetu dozvědět zaručené informace typu: swap není třeba mirrorovat, stačí, když se na obou discích nechají menší oddíly a dá se do fstab pri=1, nějak takto:
... /dev/sda3 swap swap defaults,pri=1 0 0 /dev/sdb3 swap swap defaults,pri=1 0 0 nebo-li : swapon -p 1 /dev/sda3 swapon -p 1 /dev/sdb3
Bohužel, toto není řešení, toto se spíš chová jako RAID0, výkonově určitě dobrá věc, ale v případě chyby na jednom z disků by systém nemusel dopadnout pěkně. Kdo chce tedy plně využít RAID1, tak na něj musí hodit i swap. I já jsem v dávných začátcích udělal chybu a párkrát jsem tuto dezinformaci (získanou od „zaručených“ zdrojů) šířil aniž bych se nad tím trochu zamyslel.
Mirrorovat lze celé disky, nebo samotné partitions (oddíly). Záleží čistě na vás, pro co se rozhodnete.
Můžete rozkouskovat disk a mirrorovat jednotlivé partition a nepoužívat LVM. Zde může být výhoda třeba v tom, že v případě nějakého šumu dojde k rozbití pole, tak se může rozbít jen jedno (jedna partition) a případný sync trvá kratší dobu, než kdyby se syncoval celý disk (za předpokladu nepoužití bitmapy).
Můžete mirrorovat celé disky a nad nimi mít LVM, nebo je jen standardně rozkouskovat.
Každé řešení má nějaké pro a proti a je důležité vědět, co od konkrétního řešení očekáváte a podle toho se pak rozhodnout.
Ti, co by rádi měli v poli celé disky, se také mohou zamyslet nad jednou věcí. Buď mít pole nad celým diskem, nebo nad celým diskem vytvořit jednu partition a tu mít v poli. Výhodu to má tu, že partition si můžeme udělat o fous menší a mít tak jednotnou velikost na všech diskách. Poté se nemusíme bát, že nám odejde disk a nový bude mít o fous menší kapacitu a už se nevejdeme a do pole nepůjde přidat.
A teď vysvětlení té srandy, které se říká metadata. Metadata mají v sobě informace o poli, jak se má složit, seznam vadných bloků atd.
V současné době máme k dispozici čtyři verze metadat: 0.90, 1.0, 1.1, 1.2
Grub-legacy nepodporuje verze 1.1 ani 1.2 metadat. Lilo taktéž nepodporuje verze 1.1 ani 1.2 metadat. Současná verze zavaděče „syslinux“ podporuje maximálně verzi metadat 1.0. Grub2 v klidu zvládá i metadata 1.2.
Tady bych udělal menší vsuvku kvůli grubu2. Je to docela otesánek a rozhodně bych nezačínal první partition na 63 sektoru, ale jel dnešní klasiku od 2048. sektoru (i když se nebude jednat o 4k formát / disk / ssd), aby se vše potřebné vešlo do stage1.5.
Proč tolik verzí metadat? Proč v tom dělat guláš? Na metadata se začalo tak trochu sahat hned z několika důvodů.
Takže co kdo má použít za verzi metadat?
Je to jednoduché, pokud používáte grub2, na záchranných Live CD a zmíněném stroji máte k dispozici dostatečně nové jádro a mdadm, tak vám v používání verze 1.2 nic nebrání.
Taktéž není problém kombinovat verze metadata. Vytvořit si boot oddíl a na něj umístit starší metadata (třeba kvůli zavaděči) a na systémový nebo datový oddíl použít aktuální verzi metadat. Je to zcela na vás .
Každopádně doporučuji s verzí metadat pracovat (udávat verzi do konfiguračních souborů apod.), ať člověk celou dobu ví, na čem je, a ať to také ví za X let (kdyby se třeba pole pokazilo a budou k dispozici zálohy nastavení, tak člověk hned ví).
Aktuální stav a verzi metadat jde vyzjistit takto (příklad):
mdadm --detail --scan ARRAY /dev/md2 metadata=1.2 UUID=14640e9e:d1c30960:5b020607:1eecbc2b ARRAY /dev/md3 metadata=0.90 UUID=1d4bfb10:2b00fef9:5b020607:1eecbc2b ARRAY /dev/md5 metadata=0.90 UUID=1011cbb3:b48abbe7:5b020607:1eecbc2b ARRAY /dev/md6 metadata=0.90 UUID=88018aa2:0d416a22:5b020607:1eecbc2b
V některých případech pole nemusí metadata vůbec obsahovat, ale to není moc dobrý/bezpečný nápad.
Za určitých podmínek je možné provést migraci metadat 0.90 na 1.0, jelikož jsou obě verze umístěny na konci disku, čtěte Converting between superblock versions.
Taktéž tu máme možnost externích metadat – External Metadata – s čímž nemám zkušenosti.
Zjednodušeně řečeno, bitmapa je něco jako žurnál a slouží nám k rychlejšímu zrekonstruování pole, pokud z něj disk z nějakého důvodu vypadne. Nemusí se nutně jednat o chybu disku, ale třeba špatné vypnutí systému. Bitmapa může být uložena přímo na discích v poli, říkejme jí „internal“:
# při vytváření pole : mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1 --bitmap=internal # na již vytvořeném poli : mdadm --grow /dev/md0 -b internal
Taktéž může být bitmapa uložena na externím disku, v takovém případě jí můžeme nazývat „external“. Bitmapa je tedy uložena mimo pole v souboru a podporovaný filesystém, na kterém může soubor být, je ext2 a ext3.
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1 --bitmap=/var/my_bitman.bin
V takovém případě musíme cestu k bitmapě definovat v konfiguračním souboru pole:
nano /etc/mdadm.conf ... ARRAY /dev/md0 metadata=1.2 bitmap=/var/my_bitman.bin UUID=14640e9e:d1c30960:5b020607:1eecbc2b ...
Jak jsme bitmapu vytvořili, tak jí můžeme i odstranit, stačí upravit pole s parametrem "--bitmap=none"
To, zda používáme bitmapu, poznáme např. pomocí mdstat (v tomto případě má poslední pole bitmapu):
cat /proc/mdstat Personalities : [raid1] md6 : active raid1 sdb6[0] sda6[1] 8115264 blocks [2/2] [UU] md5 : active raid1 sdb5[0] sda5[1] 1369139520 blocks [2/2] [UU] md3 : active raid1 sdb3[0] sda3[1] 29294400 blocks [2/2] [UU] md2 : active raid1 sdb2[0] sda2[1] 29294400 blocks [2/2] [UU] bitmap: 1/1 pages [4KB], 65536KB chunk unused devices: <none>
Každý jistě logickou úvahou dojde k tomu, že tato přidaná funkce bude mít asi nějakou režii navíc při zápisu do pole. Je tedy na každém, nechť sám zváží, zda použít bitmapu, či nikoli (velká x terabajtová pole se mohou skládat docela dlouho). Taktéž dopodučuji podívat se na parametr „--bitmap-chunk“.
Hlavním vývojářem subsystému MD je Neil Brown.
To by bylo k dnešní teorii asi tak vše a příště už se podíváme na něco z praxe, tzn. postup na migraci systému za běhu na pole RAID1 (popř. i jiné) krok za krokem a nějaké tipy na nastavení.
SWAP se na servery nedava kvuli vykonu. TeckaNesmysl. I na serveru s 16GB RAM se jádro může rozhodnout něco odswapovat, pokud usoudí, že danou paměť lze využít líp.
Kdyz SWAP neni, proste nastoupi OOMkiller, zabije rozbitou aplikaciKdyby tohle byla obecně pravda, vývojáři jádra by se každou chvíli nepokoušeli opravovat OOM killer. Do správné aplikace (pokud to není naprosto jasné) se totiž tak spolehlivě netrefí.
pokud jsou bezici aplilace alespon trochu spravne nakonfigurovany, tak pamet nedochaziPaměť spolehlivě nedochází pouze v případě, že se zcela zakáže overcommit
Naopak kdyz pamet zacne dochazet, tak je IMO SWAP naopak pritezi, protoze zpusobi treba i hodinovou nedostupnost serveru jako celku.Jestli to nebude spíš rukama...
The argument is basically that if you set swappiness to 100 it does aggressive page scavenging, i.e. the kernel will continuously look for pages that it can reuse. This doesn't however mean that it will always page. It also doesn't mean that if it is using swap that this pages written will ever be paged back in again. The usage of swap is not bad, it's high paging (i.e. moving blocks in and out of swap) that causes poor performance problems and especially with our config where swap in on NFS mounted drives.
If you set swapiness to any other value and in reality it makes little difference if you set it to 40, 60 or 80, then the kernel does not to aggressive scavenging. It will only start to look for pages to scavenge when it gets low on available memory. The down side to this is that when this happens it can cause the machine to 'freeze' whilst this is going on. However, the argument for this is that the machine should have sufficient memory to cope without having to scavenge. Although at best you will only ever minimize this, it's a normal kernel function and it will happen sooner or later.
What I do know for certain is that swappiness MUST be 100 for RAC DB installations. We have seen many times in the past where high loaded DB machines, say at month end, have been evicted from the RAC cluster because the kernel has gone scavenging for free pages and halted all other activity on the machines.
So evidently anything between 0 and 99 behaves pretty much the same – they have seen no real difference in behavior. However at 100 the page stealing daemon runs continuously ensuring memory is kept available. The difference on a system that has plenty of memory is a non-issue. On appropriately sized systems all values will behave pretty much the same. However on machines which begin to get into memory pressure the 100 setting incrementally begins using swap space earlier. What was found was that if it was anything other than 100 then when the paging daemon kicked in it could halt the system as it ran through the memory to clean it up the first time. This caused RAC outages and other instability.
My last conversation with SE suggested this behavior might change in OEL 6.
md=d127,/dev/sda,/dev/sdb root=/dev/md_d127p2Pro disky nad 2 TB používám metadata verze 1.0, zde uz je nutno použít initramdisk. Při použití Grub-legacy narazíte na to, ze nedokáže najít na /dev/md_d127 oddíly, protože většinou se číslo oddílu připisuje za název zařízení (končící písmenem), jenže zde název zařízení končí číslicí za niž se přidává oddělovač "p" a to už Grub-legacy neumí. Náprava je jednoduchá: uděláme symbolický link, vytvořime soubor s mapou zařízení a předáme ji grubu při spouštění:
ln -s md_d127 /dev/md_d127p echo "(hd0) /dev/md_d127p" > /boot/grub/device.map grub --device-map=/boot/grub/device.map
Já bych se initrd ani grub2 nebál.
Já se ho taky nebojím ale tohle používám už roky (verzi menší než 2 TB) a funguje to a to velmi splehlivě, a tehdy byl Grub2 ještě velmi experimentální. A initramdisk je zbytečná komplikace pokud není nezbytně potřeba (jako třeba při netbootu).
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.