Lustre
A Lustre egy klasztereket kiszolgáló, skálázható teljesítményű, párhuzamos, elosztott adattárolási architektúra. Központi eleme a Lustre fájlrendszer, mely szabványos POSIX interfészt biztosít a felhasználók számára. Legismertebb felhasználása a szuperszámítógépekhez köthető: világszerte találkozhatunk vele a legnagyobb HPC klasztereken. Ennek okai között említhetjük, hogy mind kapacitásban, mind teljesítményben skálázható, lehetővé teszi az aktív-aktív nagy rendelkezésre állású működést, valamint elmondható, hogy nagy teljesítményű és alacsony késleltetésű hálózati technológiák széles skáláját támogatja.
Felépítés

- A rendszer az alábbi elemekből épül fel:
- MGS (Management Server) / MGT (Management Target)
A konfiguráció menedzsmentmentjéért felelős. Gyakorlatban sokszor nem önálló szerver, hanem a fájlrendszer root könyvtárát is biztosító, nagy rendelkezésre állású (HA) MDS pár egyik tagjára kerül. Ez a Komondor esetében is így van.
- MDS (Metadata Server) / MDT (Metadata Target)
A metaadat szerver az MDT-ket szolgáltatja a kliensek számára. Az MDT-ken kerülnek tárolása a fájlrendszer névtérhez köthető metaadatok, mint pl. fájlnevek, attribútumok és az adattartalom elrendezés (azaz, hogy a fájl mely OST objektumokban kerül tárolásra).
- OSS (Object Storage Server) / OST (Object Storage Target)
Az adatok egy vagy több OST-n, OST objektumok formájában kerülnek tárolásra. Az OSS az általa kezelt OST-khez biztosít hozzáférést. Egy rendszeren belül többféle típusú OST (diszk, flash - ld. ábra) előfordulhat.
- kliensek
A kliensek (pl. compute, vizualizációs vagy login node) a Lustre fájlrendszer felcsatolása után írhatják/olvashatják azt.
- LNet (Lustre networking)
Különféle fizikai rétegek fölött biztosítja a Lustre rendszer elemei közötti kommunikációt és routingot. A Komondor esetében Slingshot hálózatra épül a kommunikáció.
Hasznos tudnivalók
Striping
A Lustre fájlrendszer nagy teljesítményének egyik fő összetevője az a képesség, hogy az adatokat több OST-re elosztva tároljuk. Több OST használatával mind az írás, mind az olvasás teljesítménye javítható.
Azt, hogy hány OST objektumra osztunk szét egy fájlt, a stripe_count paraméter adja meg, míg a stripe_size azt határozza meg, mekkora szeletekben írunk az OST objektumokba. A fájlrendszerre vonatkozik egy-egy alapértelmezett érték (stripe_count-ra ez 1, stripe_size-ra pedig 1MiB), melyet aztán akár könyvtárakra, akár egyedi fájlokra felülírhatunk.
Ahogy az ábrán látható, fájl írásakor stripe_size méretű szeleteket (stripe-okat) írunk az OST-kre sorban egymás után. Az adattartalom a négy OST-n allokált egy-egy OST objektumba kerül kiírásra. Mindegyik OST objektumba két-két stripe kerül.
Striping beállítása
A következő paranccsal létrehozhatunk egy fájlt a megadott striping paraméterekkel, vagy módosíthatjuk egy létező könyvtár striping beállítását, ami a benne létrehozott tartalmakra lesz hatással::
lfs setstripe -c <stripe_count> -S <stripe_size> <fájl vagy könyvtár elérési út>
Striping beállítása már létező könyvtárra (stripe_count = 2 és stripe_size = 4MiB):
lfs setstripe -c 2 -S 4M ./testdir-2s-4M
Új fájl létrehozása alapértelmezettől eltérő striping beállítással (stripe_count = 2 és stripe_size = 4MiB):
lfs setstripe -c 2 -S 4M ./testfile-2s-4M
Striping ellenőrzése
A fenti példánál maradva, ellenőrizzük a könyvtárra vonatkozó striping beállításokat:
$ lfs getstripe ./testdir-2s-4M
./testdir-2s-4M
stripe_count: 2 stripe_size: 4194304 pattern: raid0 stripe_offset: -1
Mint láthatjuk, a könyvtárra érvényes beállítás megfelel az elvártnak. Amennyiben létrehozunk benne egy fájlt, az örökli ezeket:
$ touch ./testdir-2s-4M/tf01
$ lfs getstripe ./testdir-2s-4M/tf01
./testdir-2s-4M/tf01
lmm_stripe_count: 2
lmm_stripe_size: 4194304
lmm_pattern: raid0
lmm_layout_gen: 0
lmm_stripe_offset: 3
obdidx objid objid group
3 153237056 0x9223640 0
5 45412113 0x2b4ef11 0
A könyvtárban létrehozott fájl örökölte a beállításokat. A tartalom fogadására OST003 és OST005 került kijelölésre.
A fenti példánál maradva, ellenőrizzük a létrejött fájl striping beállításait:
$ lfs getstripe ./testfile-2s-4M
./testfile-2s-4M
lmm_stripe_count: 2
lmm_stripe_size: 4194304
lmm_pattern: raid0
lmm_layout_gen: 0
lmm_stripe_offset: 5
obdidx objid objid group
5 45412112 0x2b4ef10 0
0 153553920 0x9270c00 0
$
Mint láthatjuk, a testfile-2s-4M-be írt tartalom - 4MiB-os szeletekben - OST005-re ill. OST000-ra kerül majd.
Teljesítménnyel kapcsolatos megfontolások
Figyelem
A striping beállítások nagyban befolyásolhatják a fájlműveletek teljesítményét, ezért azt az alkalmazás I/O mintázatának, valamint a fájlok méretének figyelembe vételével alakítsuk!
Stripe count
- stripe_count növelésére lehet szükség akkor, ha:
nagy fájlokkal (> 1GiB) dolgozunk
több processz egy közös fájlba (Single Shared File) dolgozik
Javaslat
Kis fájlok esetén használjuk az alapértelmezett értéket! (stripe_count = 1)
File-Per-Process I/O mintázat esetén kerüljük a stripe-olást!
Stripe size
stripe_size-nak nagy fájlokkal végzett műveleteknél lehet hatása a teljesítményre, azonban jóval csekélyebb mértékben, mint a stripe_count-nak.
Javaslat
legkisebb javasolt érték: 512KiB
legtöbb esetben 1MiB és 4MiB közötti érték megfelelő
Figyelem
stripe_size 64KiB többszöröse kell legyen!
Megjegyzés
stripe_size-nak nincs jelentősége, ha stripe_count = 1