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

Lustre felépítése
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.

Striping - az elosztott tárolás

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

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.

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