Postavljanje Linux kernela za GlusterFS

Prijevod članka pripremljen je uoči početka tečaja Administratorski Linux. Profesionalni».

Postavljanje Linux kernela za GlusterFS

Povremeno, tu i tamo, pojavljuju se pitanja o Glusterovim preporukama u vezi s podešavanjem kernela i postoji li potreba za tim.

Takva se potreba rijetko javlja. Na većini radnih opterećenja, kernel radi vrlo dobro. Iako postoji loša strana. Povijesno gledano, Linux kernel je bio spreman potrošiti puno memorije ako mu se pruži prilika, uključujući i za predmemoriju kao glavni način poboljšanja performansi.

U većini slučajeva to dobro funkcionira, ali pod velikim opterećenjem može dovesti do problema.

Imamo dosta iskustva s memorijski intenzivnim sustavima kao što su CAD, EDA i slični, koji su počeli usporavati pod velikim opterećenjem. I ponekad smo u Glusteru nailazili na probleme. Nakon pažljivog promatranja upotrebe memorije i latencije diska tijekom mnogo dana, dobili smo njihovo preopterećenje, ogroman iowait, pogreške kernela (kernel oops), zamrzavanja itd.

Ovaj je članak rezultat mnogih eksperimenata ugađanja izvedenih u različitim situacijama. Zahvaljujući ovim parametrima, poboljšana je ne samo ukupna odzivnost, već se i klaster značajno stabilizirao.

Kada je riječ o podešavanju memorije, prvo što treba pogledati je podsustav virtualne memorije (VM, virtual memory) koji ima veliki broj opcija koje vas mogu zbuniti.

vm.zamjenjivost

Parametar vm.swappiness određuje koliko kernel koristi swap (swap, straničenje) u usporedbi s RAM-om. Također je definiran u izvornom kodu kao "sklonost krađi mapirane memorije". Visoka swappiness znači da će kernel biti skloniji zamijeniti mapirane stranice. Niska vrijednost swappinessa znači suprotno: kernel će manje stranica iz memorije. Drugim riječima, što je vrijednost veća vm.swappiness, više će sustav koristiti swap.

Velika upotreba swappinga je nepoželjna, jer se ogromni blokovi podataka učitavaju i istovaruju u RAM. Mnogi ljudi tvrde da bi vrijednost swapinessa trebala biti velika, ali prema mom iskustvu, postavljanje na "0" dovodi do boljih performansi.

Više možete pročitati ovdje - lwn.net/Articles/100978

Ali, opet, ove postavke treba primjenjivati ​​pažljivo i tek nakon testiranja određene aplikacije. Za visoko opterećene streaming aplikacije, ovaj parametar bi trebao biti postavljen na "0". Kada se promijeni na "0", poboljšava se odziv sustava.

vm.vfs_cache_pressure

Ova postavka kontrolira memoriju koju kernel troši za predmemoriranje direktorija i inode objekata (dentry i inode).

Sa zadanom vrijednošću od 100, kernel će pokušati osloboditi predmemorije dentry i inode na "poštenoj" osnovi za predmemoriju stranica i swapcache. Smanjenje vfs_cache_pressure uzrokuje da kernel zadrži dentry i inode predmemorije. Kada je vrijednost "0", kernel nikada neće isprazniti dentry i inode cache zbog pritiska memorije, a to može lako dovesti do pogreške nedostatka memorije. Povećanje vfs_cache_pressure iznad 100 uzrokuje da kernel daje prioritet dentry i inode ispiranju.

Kada koriste GlusterFS, mnogi korisnici s velikim količinama podataka i mnogo malih datoteka mogu lako koristiti značajnu količinu RAM-a na poslužitelju zbog predmemoriranja inode/dentry, što može dovesti do degradacije performansi jer kernel mora obraditi strukture podataka na sustavu sa 40 GB memorije. Postavljanje ove vrijednosti iznad 100 pomoglo je mnogim korisnicima u postizanju poštenijeg predmemoriranja i poboljšanog odziva jezgre.

vm.dirty_background_ratio i vm.dirty_ratio

Prvi parametar (vm.dirty_background_ratio) određuje postotak memorije s prljavim stranicama nakon kojeg je potrebno pokrenuti ispiranje prljavih stranica u pozadini na disk. Dok se ne postigne ovaj postotak, nijedna se stranica ne ispire na disk. A kada resetiranje započne, radi u pozadini bez prekidanja pokrenutih procesa.

Drugi parametar (vm.dirty_ratio) definira postotak memorije koji mogu zauzeti prljave stranice prije početka prisilnog bljeskanja. Nakon što se dosegne ovaj prag, svi procesi postaju sinkroni (blokirani) i nije im dopušteno nastaviti sve dok I/O koji su zahtijevali nije dovršen i podaci su na disku. S teškim I/O to uzrokuje problem jer nema predmemoriranja podataka i svi procesi koji rade I/O blokirani su čekajući I/O. To dovodi do velikog broja zaustavljenih procesa, velikog opterećenja, nestabilnosti sustava i loših performansi.

Smanjenje ovih postavki uzrokuje češće brisanje podataka na disk i ne pohranjivanje u RAM. To može pomoći sustavima s velikim brojem memorije koji mogu ispirati predmemorije stranica od 45-90 GB na disk, što rezultira velikom latencijom za front-end aplikacije, smanjujući ukupnu brzinu odziva i interaktivnost.

"1" > /proc/sys/vm/pagecache

Predmemorija stranica je predmemorija koja pohranjuje podatke datoteka i izvršnih programa, odnosno to su stranice sa stvarnim sadržajem datoteka ili blok uređaja. Ova predmemorija se koristi za smanjenje broja čitanja diska. Vrijednost "1" znači da se 1% RAM-a koristi za predmemoriju i bit će više čitanja s diska nego iz RAM-a. Nije potrebno mijenjati ovu postavku, ali ako ste paranoični oko kontrole predmemorije stranice, možete je koristiti.

"rok" > /sys/block/sdc/queue/scheduler

I/O planer je komponenta jezgre Linuxa koja upravlja redovima čekanja za čitanje i pisanje. U teoriji, bolje je koristiti "noop" za pametni RAID kontroler, jer Linux ne zna ništa o fizičkoj geometriji diska, pa je učinkovitije pustiti kontroler, koji dobro poznaje geometriju diska, da obradi zahtjev što brže moguće. Ali izgleda da "rok" poboljšava izvedbu. Više o planerima možete pročitati u dokumentaciji izvornog koda jezgre Linuxa: linux/Documentation/block/*osched.txt. Također sam vidio povećanje u propusnosti čitanja tijekom mješovitih operacija (mnogo pisanja).

"256" > /sys/block/sdc/queue/nr_requests

Broj I/O zahtjeva u međuspremniku prije nego što se proslijede planeru. Interna veličina reda čekanja nekih kontrolera (queue_depth) je veća od nr_requests I/O planera, tako da I/O planer ima male šanse za ispravno određivanje prioriteta i spajanje zahtjeva. Za rokove i CFQ planere, bolje je kada je nr_requests 2 puta interni red čekanja kontrolera. Spajanje i preuređivanje zahtjeva pomaže planeru da bolje reagira pod velikim opterećenjem.

echo "16" > /proc/sys/vm/page-cluster

Parametar page-cluster kontrolira broj stranica koje se upisuju u swap odjednom. U gornjem primjeru, vrijednost je postavljena na "16" u skladu s veličinom trake RAID od 64 KB. To nema smisla sa swappiness = 0, ali ako postavite swappiness na 10 ili 20 tada će vam korištenje ove vrijednosti pomoći kada je veličina trake RAID 64K.

blockdev --setra 4096 /dev/<devnoname> (-sdb, hdc ili dev_mapper)

Zadane postavke blok uređaja za mnoge RAID kontrolere često rezultiraju užasnim performansama. Dodavanjem gornje opcije postavlja se čitanje unaprijed za sektore od 4096 * 512 bajta. U najmanju ruku, za operacije strujanja, brzina se povećava punjenjem predmemorije diska na čipu s čitanjem unaprijed tijekom razdoblja koje kernel koristi za pripremu I/O. Predmemorija može sadržavati podatke koji će biti zatraženi pri sljedećem čitanju. Previše prethodnog dohvaćanja može prekinuti nasumični I/O za velike datoteke ako koristi potencijalno korisno vrijeme na disku ili učitava podatke izvan predmemorije.

Ispod je još nekoliko preporuka na razini datotečnog sustava. Ali još nisu testirani. Provjerite zna li vaš datotečni sustav veličinu trake i broj diskova u nizu. Na primjer, da je ovo 5K stripe raid64 polje od šest diskova (zapravo pet, jer se jedan disk koristi za paritet). Ove preporuke temelje se na teoretskim pretpostavkama i sastavljene su iz raznih blogova/članaka stručnjaka za RAID.

-> ext4 fs, 5 disks, 64K stripe, units in 4K blocks
mkfs -text4 -E stride=$((64/4))
-> xfs, 5 disks, 64K stripe, units in 512-byte sectors
mkfs -txfs -d sunit=$((64*2)) -d swidth=$((5*64*2))

Za velike datoteke razmislite o povećanju gore navedenih veličina pruga.

UPOZORENJE! Sve gore opisano vrlo je subjektivno za neke vrste aplikacija. Ovaj članak ne jamči nikakva poboljšanja bez prethodnog korisničkog testiranja povezanih aplikacija. Treba ga koristiti samo ako je potrebno poboljšati ukupnu odzivnost sustava ili ako rješava trenutne probleme.

Dodatni materijali:

Postavljanje Linux kernela za GlusterFS

Čitaj više

Izvor: www.habr.com

Dodajte komentar