A hálózati fájlrendszerek használata ma már szinte minden Linuxos környezetben alapvető dolognak számít. Legyen szó otthoni médiaszerverről, fejlesztői munkakörnyezetről vagy akár kisebb irodai infrastruktúráról, az NFS (Network File System) egyszerűsége és natív Linux támogatása miatt továbbra is az egyik legnépszerűbb megoldás. Sok felhasználó azonban csak telepíti, beállítja, majd használja – és közben nem is sejti, hogy néhány apró finomhangolással jelentős teljesítménynövekedést lehet elérni. Ha az NFS megosztás lassúnak érződik, akadozik a fájlmásolás, vagy egyszerűen nem használja ki teljesen a rendelkezésre álló hálózati sávszélességet, akkor érdemes alaposabban megvizsgálni a konfigurációt.
Az NFS teljesítménye alapvetően három tényezőtől függ: a hálózati infrastruktúrától, a szerver és kliens rendszerbeállításaitól, valamint a mount paraméterektől. Hiába rendelkezünk gyors SSD-vel és gigabites hálózattal, ha az alapértelmezett konfiguráció konzervatív értékekkel dolgozik.
Az első és legfontosabb lépés az NFS verziójának megválasztása. Modern Linux rendszereken érdemes minden esetben az NFSv4 vagy annál frissebb implementáció használata. Az NFSv3 ugyan sok helyen még mindig működik, de a teljesítmény és a hatékonyabb kapcsolatkezelés szempontjából az NFSv4 egyértelmű előrelépés. A csatoláskor ezt explicit módon is megadhatja:
mount -t nfs -o vers=4.2 server:/megosztas /mnt/nfs
Ha állandó csatolást használunk az /etc/fstab fájlban, ott is érdemes ezt rögzíteni. Az automatikus verzióválasztás nem mindig optimális.
A következő kulcsterület az olvasási és írási blokkméret. Az NFS alapértelmezett értékei sok esetben megfelelőek, de nagy fájlok mozgatásánál jelentős gyorsulást hozhat az rsize és a wsize paraméterek növelése. Tipikus modern érték a 1048576 byte, vagyis 1 MB. Az rsize és a wsize paraméterek legkisebb értéke 1024 lehet, legnagyobb értéke 1048576. A beállított értéknek 1024-nek vagy egész számú többszörösének kell lennie. Amennyiben az rsize és a wsize paraméterek nincsenek megadva, vagy a szerver vagy a kliens nem támogatja a megadott értéket, akkor a a szerver és a kliens megállapodnak a megfelelő értékben.
Például:
server:/megosztas /mnt/nfs nfs4 defaults,rsize=1048576,wsize=1048576,vers=4.2 0 0
Ez különösen akkor hoz érezhető javulást, ha nagyobb állományokkal dolgozunk, például ISO-lemezkép fájlokkal, videókkal vagy mentésekkel. Kis fájlok esetében a különbség kevésbé látványos, de még ott is javíthatja az általános válaszidőt.
A noatime opció szintén sokat segíthet. Alapértelmezésben minden fájlelérés frissíti a hozzáférési időbélyeget, ami felesleges extra írási műveleteket generálhat. Ha nincs szükségünk erre az információra, bátran kikapcsolhatja a mount parancs paraméterenként vagy az fstab fájlban:
noatime
Ez különösen olyan rendszereken hasznos, ahol sok olvasási művelet történik.
Érdemes figyelmet fordítani a szinkronizációs módokra is. Az NFS szerver export beállításainál gyakran találkozunk a sync opcióval, amely garantálja, hogy minden írás fizikailag lemezre kerüljön a válasz előtt. Ez biztonságos, de lassabb. Ha a környezet megengedi, az async használata jelentős sebességnövekedést eredményezhet:
/megosztas 192.168.1.0/24(rw,async,no_subtree_check)
Fontos azonban, hogy ez áramszünet vagy rendszerhiba esetén adatvesztési kockázatot hordozhat. Otthoni környezetben gyakran vállalható kompromisszum, kritikus rendszereknél viszont inkább maradjunk a szinkron működésnél.
A hálózati réteg optimalizálása sem maradhat ki. Ha gigabites vagy gyorsabb kapcsolatot használunk, ellenőrizzük, hogy a hálózati interfész valóban a maximális sebességen működik-e:
ethtool eth0
Ha a duplex mód vagy a sebesség nem megfelelő, az azonnali teljesítményromlást okoz. Ugyancsak érdemes jumbo frame-ekkel kísérletezni, amennyiben az összes hálózati eszköz támogatja az MTU 9000 használatát. Ez csökkenti a CPU-terhelést nagy adatforgalom mellett.
Az NFS kliens oldali gyorsítótárazása gyakran alulértékelt tényező. A actimeo paraméter segítségével szabályozható, mennyi ideig maradjanak cache-ben a fájlattribútumok. Például:
actimeo=60
Ez csökkenti a szerver felé irányuló lekérdezések számát, és jelentősen gyorsíthatja a könyvtárlistázást vagy a sok apró fájllal végzett műveleteket. Hátránya, hogy a változások nem jelennek meg azonnal minden kliensen.
Ha komolyabb terhelés alatt használjuk az NFS-t, a szerver oldali daemonok számának növelése is segíthet. Az NFS kernel szerver párhuzamos szálainak számát a rendszer konfigurációjában állíthatjuk. Debian-alapú rendszereken – így Linux Mint alatt is – az /etc/default/nfs-kernel-server fájlban módosítható:
RPCNFSDCOUNT=16
A több worker szál nagyobb párhuzamos kiszolgálást tesz lehetővé, különösen több kliens esetén.
Enterprise Linux esetén ennek beállítása a /etc/nfs.conf fájlban van lehetőség:
Az
[nfsd]
részben a
threads=16
történő beállítása.
A teljesítményhangolás egyik legjobb eszköze maga a mérés. A szubjektív benyomás helyett érdemes konkrét teszteket futtatni. Az dd, fio vagy akár egyszerű fájlmásolási benchmarkok gyorsan megmutatják, hogy egy-egy módosítás valóban javulást hozott-e.
Például:
dd if=/dev/zero of=/mnt/nfs/testfile bs=1G count=1 oflag=direct
Ezzel jól összehasonlítható az egyes beállítások hatása.
Összességében elmondható, hogy az NFS teljesítménye messze nem csak a hardveren múlik. Egy gondosan hangolt konfigurációval akár 20–50 százalékos gyorsulás is elérhető, különösebb beruházás nélkül. A legjobb eredményt általában az NFSv4 használata, a megfelelő blokkméret, az optimalizált cache-beállítások és a stabil hálózati infrastruktúra együttese adja. Mint oly sok minden Linux alatt, itt is igaz: a rendszer alapból működik, de az igazi teljesítmény a finomhangolás során bontakozik ki.
# host=
# port=0
# grace-time=90
# lease-time=90
# udp=y
# tcp=y
# vers2=n
# vers3=y
# vers4=y
# vers4.0=y
# vers4.1=y
# vers4.2=y
# rdma=n
#
#[statd]
# debug=0
# port=0
# outgoing-port=0
# name=
# state-directory-path=/var/lib/nfs/statd
# ha-callout=
# no-notify=0
#
#[sm-notify]
# debug=0
# force=0
# retry-time=900
# outgoing-port=
# outgoing-addr=
# lift-grace=y
