A cikk ötlete vĂ©letlenĂŒl szĂŒletett egy kommentĂĄrban folyĂł vitĂĄbĂłl. .

A belsĆ sajĂĄtossĂĄga szolgĂĄltatĂĄsaink mƱködĂ©sĂ©nek, hogy hatalmas mennyisĂ©gƱ kicsi fĂĄjl tĂĄrolĂĄsĂĄval foglalkozunk. Jelenleg körĂŒlbelĂŒl több szĂĄz terabĂĄjt ilyen adatunk van. RĂĄakadtunk nĂ©hĂĄny nyilvĂĄnvalĂł Ă©s nem annyira nyilvĂĄnvalĂł nehĂ©zsĂ©gre, de sikeresen megoldottuk azokat.
Ezért megosztom tapasztalatainkat, håtha valakinek hasznos lesz.
ElsĆ problĂ©ma: âNincs elĂ©g hely az eszközönâ
Mint a fent emlĂtett cikkben emlĂtettem, a problĂ©ma az, hogy a fĂĄjlrendszerben van szabad blokk, azonban az inode-k elfogytak.
Az hasznĂĄlt Ă©s szabad inodok szĂĄmĂĄt a következĆ paranccsal lehet ellenĆrizni: df -ih:

Nem fogom Ășjra elmondani a cikket, ha röviden szeretnĂ©m összefoglalni, a lemezen vannak blokkok közvetlenĂŒl az adatok szĂĄmĂĄra, valamint blokkok a meta-informĂĄciĂłk szĂĄmĂĄra, ezek az inode-ok (index csomĂłpont). SzĂĄmuk a fĂĄjlrendszer inicializĂĄlĂĄsakor van megadva (az ext2-rĆl Ă©s annak örököseirĆl van szĂł), Ă©s azutĂĄn nem vĂĄltozik. Az adatok Ă©s az inode-ok közötti egyensĂșlyt statisztikai adatok alapjĂĄn szĂĄmoljĂĄk ki, azonban a mi esetĂŒnkben, ahol sok kicsi fĂĄjl van, az egyensĂșlynak inkĂĄbb az inode-ok szĂĄmĂĄnak irĂĄnyĂĄba kell eltolĂłdnia - ezekbĆl több kell.
Linuxban mĂĄr elĆre lĂĄttak kĂŒlönbözĆ egyensĂșlyozĂĄsi lehetĆsĂ©geket, Ă©s ezek a kalkulĂĄlt konfigurĂĄciĂłk a /etc/mke2fs.conf.
fĂĄjlban talĂĄlhatĂłk.
Ăme nĂ©hĂĄny pĂ©lda a fĂĄjlbĂłl:
small = {
blocksize = 1024
inode_size = 128
inode_ratio = 4096
}
big = {
inode_ratio = 32768
}
largefile = {
inode_ratio = 1048576
blocksize = -1
}
A megfelelĆ felhasznĂĄlĂĄsi lehetĆsĂ©get az â-Tâ opciĂłval vĂĄlaszthatjuk ki a mke2fs hĂvĂĄsĂĄnĂĄl. Ezen kĂvĂŒl kĂ©zi paramĂ©terezĂ©st is lehetĆsĂ©ges, ha nincs kĂ©sz megoldĂĄs.
Tovåbbi részletek talålhatók a mke2fs.conf és mke2fs.
A fent emlĂtett cikkben nem Ă©rintett sajĂĄtossĂĄg - megadhatĂł az adatok blokkjĂĄnak mĂ©rete. NyilvĂĄnvalĂł, hogy nagy fĂĄjlok esetĂ©n Ă©rdemesebb nagyobb blokkmĂ©retet vĂĄlasztani, mĂg kisebb fĂĄjlok esetĂ©n a kisebb a megfelelĆ.
Ugyanakkor Ă©rdemes figyelembe venni egy Ă©rdekes sajĂĄtossĂĄgot, mint a processzor architektĂșrĂĄja.
Valamikor azt fontolgattam, hogy a nagyobb fĂ©nykĂ©pekhez nagyobb blokk mĂ©ret lenne szĂŒksĂ©ges. Ez mĂ©g otthoni körĂŒlmĂ©nyek között törtĂ©nt, egy WD nevĂ©vel ellĂĄtott hĂĄzi tĂĄrolĂłn, ARM architektĂșrĂĄn. Nem sokĂĄig gondolkodtam, Ă©s a blokk mĂ©retet 8k-ra vagy 16k-ra ĂĄllĂtottam a standard 4k helyett, miutĂĄn elĆször lemĂ©rtem a megtakarĂtĂĄst. Ăs minden csodĂĄlatosan mƱködött, egĂ©szen addig, amĂg magĂĄnak a tĂĄrolĂłnak nem lett volna hibĂĄja, miközben a lemez Ă©pen maradt. Amikor a lemezt egy klasszikus szĂĄmĂtĂłgĂ©pbe ĂĄllĂtottam, amelyben egy hagyomĂĄnyos Intel processzor volt, meglepetĂ©s Ă©rt: nem tĂĄmogatott blokk mĂ©ret. Bajban voltunk. Az adatok megvoltak, minden rendben, de olvasni lehetetlen volt. Az i386 processzorok Ă©s hasonlĂłk nem tudnak olyan blokk mĂ©retekkel dolgozni, amelyek nem felelnek meg a memĂłriaoldal mĂ©retĂ©nek, ami pontosan 4k. ĂsszessĂ©gĂ©ben az ĂŒgy vĂ©gĂŒl felhasznĂĄlĂłi tĂ©rbĆl szĂĄrmazĂł segĂ©dprogramokkal zĂĄrult, minden lassĂș Ă©s szomorĂș volt, de az adatokat megmentettĂŒk. Akinek Ă©rdekes â keressen rĂĄ a segĂ©dprogram nevĂ©re. fuseext2. TanulsĂĄg: vagy minden esetet elĆre ĂĄtgondolni, vagy ne Ă©pĂtsĂŒnk magunkbĂłl szuperhĆst, Ă©s hasznĂĄljuk a hĂĄztartĂĄsok szĂĄmĂĄra szolgĂĄlĂł szabvĂĄnyos beĂĄllĂtĂĄsokat.
UPD. Egy felhasznĂĄlĂłi megjegyzĂ©s alapjĂĄn kijavĂtom, hogy az i386 esetĂ©ben a blokk mĂ©ret nem haladhatja meg a 4k-t, de nem szĂŒksĂ©ges, hogy pontosan 4k legyen, tehĂĄt 1k Ă©s 2k is megengedett.
Tehåt, hogyan oldottuk meg a problémåkat.
ElĆször is, a problĂ©mĂĄval akkor szembesĂŒltĂŒnk, amikor a sok terabĂĄjtos lemez tele volt adatokkal, Ă©s a fĂĄjlrendszer konfigurĂĄciĂłjĂĄt nem tudtuk megvĂĄltoztatni.
MĂĄsodsorban sĂŒrgĆs megoldĂĄsra volt szĂŒksĂ©g.
VĂ©gĂŒl arra a következtetĂ©sre jutottunk, hogy vĂĄltoztatnunk kell az egyensĂșlyon, csökkentve a fĂĄjlok szĂĄmĂĄt.
A fĂĄjlok szĂĄmĂĄnak csökkentĂ©sĂ©re Ășgy döntöttĂŒnk, hogy az összes fĂĄjlt egy közös archĂvumba helyezzĂŒk. Figyelembe vĂ©ve a specifikĂĄciĂłnkat, mindent egy archĂvumba gyƱjtöttĂŒnk egy adott idĆszakon belĂŒl, Ă©s naponta Ă©jszaka cron feladatot hajtottunk vĂ©gre az archivĂĄlĂĄsra.
ZIP-archĂvum lett kivĂĄlasztva. A korĂĄbbi cikk megjegyzĂ©sei között a tar javasolt volt, de ennek van egy nehĂ©zsĂ©ge: nem rendelkezik tĂĄblĂĄzattal, Ă©s a fĂĄjlok következetesen helyezkednek el benne (nem vĂ©letlenĂŒl hĂvjĂĄk «tar»-nak, ami a «Tape Archive» rövidĂtĂ©se, a szalagos tĂĄrolĂłk öröksĂ©ge), tehĂĄt ha a fĂĄjlt az archĂvum vĂ©gĂ©n szeretnĂ©nk olvasni - az archĂvum teljes ĂĄtolvasĂĄsa szĂŒksĂ©ges, mivel nincs eltolĂĄs az egyes fĂĄjlokhoz kĂ©pest az archĂvum elejĂ©hez. EzĂ©rt ez egy hosszĂș mƱvelet. A ZIP sokkal jobb: rendelkezik a keresett tĂĄblĂĄzattal Ă©s a fĂĄjlok eltolĂĄsĂĄval az archĂvum belsejĂ©ben, Ă©s a hozzĂĄfĂ©rĂ©si idĆ minden fĂĄjlhoz nem fĂŒgg a helyzetĂ©tĆl. A mi esetĂŒnkben a â0â tömörĂtĂ©si opciĂłt is be lehetett ĂĄllĂtani, mivel az összes fĂĄjl elĆre tömörĂtve volt gzip formĂĄtumban.
Az ĂŒgyfelek az nginx-en keresztĂŒl kĂŒldik le a fĂĄjlokat, Ă©s a rĂ©gi API szerint csak a fĂĄjl nevĂ©t kell megadni, pĂ©ldĂĄul az alĂĄbbiak szerint:
http://www.server.com/hydra/20170416/0453/3bd24ae7-1df4-4d76-9d28-5b7fcb7fd8e5
A fĂĄjlok futĂĄs közbeni kicsomagolĂĄsĂĄhoz megtalĂĄltuk Ă©s csatlakoztattuk az nginx-unzip-module modult () Ă©s beĂĄllĂtottunk kĂ©t upstream-et.
Ennek eredményeként ilyen konfiguråció jött létre:

A kĂ©t hoszt a beĂĄllĂtĂĄsokban Ăgy nĂ©zett ki:
server {
listen *:8081;
location / {
root /home/filestorage;
}
}server {
listen *:8082;
location ~ ^/hydra/(d+)/(\d+)/(.*)$ {
root /home/filestorage;
file_in_unzip_archivefile "/home/filestorage/hydra/$1/$2.zip";
file_in_unzip_extract "$2/$3";
file_in_unzip;
}
}
Ăs a upstream konfigurĂĄciĂł a magasabb szintƱ nginx-en:
upstream storage {
server server.com:8081;
server server.com:8082;
}
Hogy mƱködik:
- Az ĂŒgyfĂ©l a front nginx-re megy
- A front nginx megprĂłbĂĄlja közvetlenĂŒl a fĂĄjlt kiszolgĂĄlni az elsĆ upstream-bĆl, azaz közvetlenĂŒl a fĂĄjlrendszerbĆl
- Ha a fĂĄjl nem lĂ©tezik, megprĂłbĂĄlja kiszolgĂĄlni a mĂĄsodik upstream-bĆl, amely megprĂłbĂĄlja megtalĂĄlni a fĂĄjlt az archĂvumban
A måsodik probléma: megint «No space left on device»
Ez a mĂĄsodik problĂ©ma, amellyel akkor szembesĂŒltĂŒnk, amikor sok fĂĄjl talĂĄlhatĂł a könyvtĂĄrban.
MegprĂłbĂĄlunk lĂ©trehozni egy fĂĄjlt, a rendszer azt panaszolja, hogy nincs hely. MegvĂĄltoztatjuk a fĂĄjl nevĂ©t, Ă©s Ășjra megprĂłbĂĄljuk lĂ©trehozni.
SikerĂŒl.
KörĂŒlbelĂŒl Ăgy nĂ©z ki:

Az inodes ellenĆrzĂ©se nem tanĂșsĂtott semmit - sok szabad van belĆlĂŒk.
A hely ellenĆrzĂ©se - ugyanaz.
Arra gondoltunk, hogy talĂĄn tĂșl sok fĂĄjl van a könyvtĂĄrban, Ă©s erre van korlĂĄtozĂĄs, de ismĂ©t nem: A könyvtĂĄron belĂŒli fĂĄjlok maximĂĄlis szĂĄma: ~1,3 Ă 10^20
Ăs egy fĂĄjlt is lĂ©tre lehet hozni, ha megvĂĄltoztatjuk a nevĂ©t.
Tehåt a probléma a fåjl nevében van.
A tovĂĄbbi keresgĂ©lĂ©s azt mutatta, hogy a problĂ©ma a könyvtĂĄri index Ă©pĂtĂ©se sorĂĄn alkalmazott hash algoritmusban rejlik, sok fĂĄjl esetĂ©n ĂŒtközĂ©sek lĂ©pnek fel, minden következmĂ©nnyel egyĂŒtt. BĆvebben itt olvashatsz:
Ezt az opciĂłt kikapcsolhatja, de a fĂĄjlnevek szerinti keresĂ©s elĆre kiszĂĄmĂthatatlanul hosszĂș lehet, ha az összes fĂĄjlt vĂ©gig kell jĂĄrni.
tune2fs -O "^dir_index" /dev/sdb3
ĂltalĂĄnossĂĄgban, mint ideiglenes megoldĂĄs, mƱködhet.
Moral: sok fåjl a könyvtårban åltalåban rossz. Ezt nem szabad csinålni.
Ilyen esetekben ĂĄltalĂĄban fĂĄjlnevek kezdĆbetƱi vagy mĂĄs paramĂ©terek, pĂ©ldĂĄul dĂĄtumok szerint belsĆ könyvtĂĄrakat hoznak lĂ©tre, ami a legtöbb esetben segĂt.
De a kis fĂĄjlok összesĂtett szĂĄma tovĂĄbbra is problĂ©mĂĄs, mĂ©g ha könyvtĂĄrakba is soroljuk Ćket â akkor lĂĄsd az elsĆ problĂ©mĂĄt.
Harmadik problĂ©ma: hogyan nĂ©zhetjĂŒk meg a fĂĄjlok listĂĄjĂĄt, ha sok van belĆlĂŒk?
A helyzetĂŒnkben, ahol sok fĂĄjlunk van, valahogy szembesĂŒltĂŒnk azzal a problĂ©mĂĄval, hogy hogyan nĂ©zhessĂŒk meg a könyvtĂĄr tartalmĂĄt.
A standard megoldĂĄs â a parancs ls.
OkĂ©, nĂ©zzĂŒk meg, mi törtĂ©nik 4772098 fĂĄjl esetĂ©n:
$ time ls /home/app/express.repository/offercache/ >/dev/null
real 0m30.203s
user 0m28.327s
sys 0m1.876s
30 mĂĄsodperc... ez soknak tƱnik. Az idĆ legnagyobb rĂ©sze a felhasznĂĄlĂłi tĂ©r fĂĄjljainak feldolgozĂĄsĂĄra megy el, nem pedig a mag (kernel) munkĂĄjĂĄra.
De van megoldĂĄs:
$ time find /home/app/express.repository/offercache/ >/dev/null
real 0m3.714s
user 0m1.998s
sys 0m1.717s
3 mĂĄsodperc. 10-szer gyorsabb.
HurrĂĄ!
UPD.
MĂ©g gyorsabb megoldĂĄs a felhasznĂĄlĂłtĂłl â a rendezĂ©s kikapcsolĂĄsa a ls
time ls -U /home/app/express.repository/offercache/ >/dev/null
real 0m2.985s
user 0m1.377s
sys 0m1.608s
Negyedik probléma: magas LA fåjlok kezelésekor
IdĆrĆl idĆre felmerĂŒl a helyzet, amikor rengeteg fĂĄjlt kell ĂĄtmĂĄsolni egyik gĂ©prĆl a mĂĄsikra. Eközben gyakran jelentĆsen megnĆ a LA, mivel minden a lemezek teljesĂtmĂ©nyĂ©be ĂŒtközik.
A legĂ©rtelmesebb, amit szeretnĂ©nk â SSD-t hasznĂĄlni. ValĂłban menĆ. Csak a több terabĂĄjtos SSD ĂĄra a kĂ©rdĂ©s.
De ha a lemezek normĂĄlisak, a fĂĄjlokat ĂĄt kell mĂĄsolni, Ă©s ez rĂĄadĂĄsul egy produkciĂłs rendszer, ahol a tĂșlterhelĂ©s elĂ©gedetlensĂ©get okoz az ĂŒgyfelek rĂ©szĂ©rĆl? LegalĂĄbb kĂ©t hasznos eszköz ĂĄll rendelkezĂ©sre: kellemes Ă©s ionice.
kellemes â csökkenti a folyamat prioritĂĄsĂĄt, Ăgy a scheduler több idĆkvantumot oszt mĂĄs, magasabb prioritĂĄsĂș folyamatoknak.
Gyakorlatunkban segĂtett a nice maximĂĄlis (19 â a legalacsonyabb prioritĂĄs, -20 (mĂnusz 20) â a legmagasabb) beĂĄllĂtĂĄsa.
ionice â Ăgy korrigĂĄlja a bemeneti/kimeneti (I/O scheduling) prioritĂĄst.
Ha RAID-t hasznĂĄl, Ă©s hirtelen szinkronizĂĄlnia kell (pĂ©ldĂĄul egy sikertelen ĂșjraindĂtĂĄs utĂĄn, vagy a RAID tömb helyreĂĄllĂtĂĄsa utĂĄn egy lemezcsere miatt), akkor bizonyos helyzetekben Ă©rdemes csökkenteni a szinkronizĂĄlĂĄs sebessĂ©gĂ©t, hogy a többi folyamat viszonylag megfelelĆen mƱködhessen. Ehhez segĂt a következĆ parancs:
echo 1000 > /proc/sys/dev/raid/speed_limit_max
Ătödik problĂ©ma: Hogyan szinkronizĂĄljunk fĂĄjlokat valĂłs idĆben
Ugyanazokkal a hatalmas mennyisĂ©gƱ fĂĄjlokkal rendelkezĂŒnk, amelyeket biztonsĂĄgi mentĂ©skĂ©nt el kell kĂŒldeni a mĂĄsodik szerverre a lehetsĂ©ges vesztesĂ©gek elkerĂŒlĂ©se Ă©rdekĂ©ben... A fĂĄjlok folyamatosan ĂrĂłdnak, ezĂ©rt minimĂĄlis vesztesĂ©g elĂ©rĂ©se Ă©rdekĂ©ben a lehetĆ leggyorsabban kell mĂĄsolni Ćket.
A standard megoldĂĄs: Rsync SSH-n keresztĂŒl.
Ez jĂł lehetĆsĂ©g, ha csak nem kell ezt több mĂĄsodpercenkĂ©nt megtenni. RĂĄadĂĄsul sok fĂĄjl van. MĂ©g ha nem is mĂĄsoljuk Ćket â akkor valahogy tudnunk kell, hogy mi vĂĄltozott, Ă©s több milliĂł fĂĄjl összehasonlĂtĂĄsa idĆt Ă©s terhelĂ©st jelent a lemezeken.
Vagyis azonnal tudnunk kell, hogy mit kell mĂĄsolni anĂ©lkĂŒl, hogy minden alkalommal el kellene indĂtani az összehasonlĂtĂĄst.
A megoldĂĄs â lsyncd. Lsyncd â . Ez is az rsync-en keresztĂŒl mƱködik, de emellett figyeli a fĂĄjlrendszert a vĂĄltozĂĄsok szempontjĂĄbĂłl az inotify Ă©s fsevents hasznĂĄlatĂĄval, Ă©s csak azokat a fĂĄjlokat mĂĄsolja, amelyek megjelentek vagy megvĂĄltoztak.
Hatodik probléma: hogyan hatårozzuk meg, ki terheli a lemezeket
ValĂłszĂnƱleg mindenki tudja, de azĂ©rt a teljessĂ©g kedvéért: a lemezes alrendszer megfigyelĂ©sĂ©re a következĆ parancs ĂĄll rendelkezĂ©sre: iotop â hasonlĂł top, de megmutatja a legaktĂvabban hasznĂĄlt folyamatokat a lemezeken.

EgyĂ©bkĂ©nt a rĂ©gi, jĂł öreg top is segĂt megĂ©rteni, hogy vannak-e problĂ©mĂĄk a lemezekkel. Ehhez kĂ©t legmegfelelĆbb paramĂ©ter van: Load Average Ă©s IOwait.

Az elsĆ mutatja, hĂĄny folyamat vĂĄr a kiszolgĂĄlĂĄsra, ĂĄltalĂĄban ha több mint 2 van, mĂĄr valami nem stimmel. AktĂv biztonsĂĄgi mentĂ©s kĂ©szĂtĂ©sekor a hĂĄttĂ©rszerverek szĂĄmĂĄra 6-8-as Ă©rtĂ©k elfogadhatĂł, ezen tĂșl a helyzet rendellenesnek szĂĄmĂt.
A mĂĄsodik mutatja, mennyire van a processzor a lemezes mƱveletekkel elfoglalva. Az IOwait >10% aggodalomra ad okot, bĂĄr a speciĂĄlis terhelĂ©sprofilĂș szervereink esetĂ©n gyakran 40-50%-os stabil terhelĂ©st tapasztalunk, ami tĂ©nyleg normĂĄlis.
Ezen be is fejezem, bĂĄr biztosan sok olyan szempont van, amivel mĂ©g nem talĂĄlkoztunk, örömmel vĂĄrom a kommentĂĄrokat Ă©s Ă©rdekes, valĂłs esetek leĂrĂĄsait.
ForrĂĄs: habr.com
