Artikli idee tulenes spontaanselt arutelust kommentaarides artikli all .

Asi on selles, et meie teenuste sisemine eripĂ€ra on tohutu hulga vĂ€ikeste failide salvestamine. Praegusel hetkel on meil sadu terabait selliseid andmeid. Oleme silmitsi seisnud mĂ”ne ilmselge ja mitte nii ilmselge probleemiga ning oleme neist edukalt ĂŒle saanud.
SeetÔttu jagan meie kogemusi, ehk on kellelegi kasuks.
Esimene probleem: âSeadmel pole ruumiâ
Nagu mainitud eelnevas artiklis, on probleem selles, et failisĂŒsteemis on vabad plokid, kuid inode'id on otsas.
Kasutatud ja vabad inode'id saab kontrollida kÀsklusega df -ih:

Ma ei hakka artiklit ĂŒmber jutustama, lĂŒhidalt öeldes, kettal on nii plokke, mis on mĂ”eldud otse andmete jaoks, kui ka plokke meta-informatsiooni jaoks, need on inode'id (indeksi sĂ”lm). Nende arv mÀÀratakse failisĂŒsteemi initsialiseerimisel (rÀÀgime ext2 ja selle jĂ€reltulijatest) ning hiljem ei muutu. Andmeplokkide ja inode'ide tasakaalu arvutatakse keskmiste andmete pĂ”hjal, meie puhul, kus on palju vĂ€ikeseid faile, peaks tasakaal olema suunatud inode'ide arvu suurendamisele â neid peaks olema rohkem.
Linuxis on juba ette nÀhtud erinevate tasakaalude variandid, ja kÔik need eelnevalt arvutatud konfiguratsioonid asuvad failis /etc/mke2fs.conf.
SeetĂ”ttu saab failisĂŒsteemi esmakordsel initsialiseerimisel kĂ€sklusega mke2fs mÀÀrata soovitud profiili.
Siin on mÔned nÀited failist:
small = {
blocksize = 1024
inode_size = 128
inode_ratio = 4096
}
big = {
inode_ratio = 32768
}
largefile = {
inode_ratio = 1048576
blocksize = -1
}
Sobiva kasutusvĂ”imaluse valimiseks saab kasutada valikut â-Tâ kĂ€skluse mke2fs kutsumisel. Samuti saab vajadusel kĂ€sitsi mÀÀrata vajalikud parameetrid, kui ei ole valmis lahendust.
Rohkem ĂŒksikasju on kirjeldatud manuaalides mke2fs.conf ja mke2fs.
Ăksikasjad, mis ei olnud eelnevas artiklis kĂ€sitletud â andmeploki suurust saab mÀÀrata. Ilmselgelt on suurte failide jaoks mĂ”istlikud suuremad plokid, vĂ€ikeste jaoks aga vĂ€iksemad.
Siiski tuleks arvesse vÔtta sellist huvitavat omadust nagu protsessori arhitektuur.
MĂ”tlesin kunagi, et suurte piltide puhul on mul vaja suuremat ploki suurust. See toimus kodustes tingimustes, WD nime all tuntud kodu serveris, mis oli ehitatud ARM arhitektuuri peale. MĂ”tlesin siis, et seadistan ploki suuruseks kas 8k vĂ”i 16k, standardse 4k asemel, pĂ€rast eelnevat sÀÀstude mÔÔtmist. KĂ”ik oli suurepĂ€rane, kuni server ĂŒhel hetkel ĂŒles ĂŒtles, samas kĂ”vaketas töötas. Panin kĂ”vaketta tavalisse arvutisse tavalise Intel-i protsessoriga ja sain ĂŒllatuse: toetamata ploki suurus. Andmed olid olemas, kĂ”ik oli korras, aga lugeda ei saanud. i386 protsessorid ja sarnased ei oska töötada plokkide suurustega, mis ei vasta mĂ€lu lehe suurusele, mis on tĂ€pselt 4k. LĂ”ppkokkuvĂ”ttes kasutasime user space'i tööriistu, kĂ”ik kĂ€is aeglaselt ja kurvalt, kuid me pÀÀstsime andmed. Huvi korral â otsige tööriista nime jĂ€rgi fuseext2. Moraal: kas mĂ”elda kĂ”ik juhtumid ette vĂ”i mitte teeselda superkangelast ja kasutada standardseid seadistusi koduperenaiste jaoks.
UPD. Ăhe kasutaja mĂ€rkuse kohaselt tĂ€psustan, et i386 ploki suurus ei tohi ĂŒletada 4k, kuid ei pea olema tĂ€pselt 4k, st lubatud on 1k ja 2k.
Nii et, kuidas meie probleemid lahendasime.
Esiteks, me puutusime probleemiga kokku, kui mitme terabaidi suurune kĂ”vaketas oli andmetega tĂ€idetud, ja me ei saanud failisĂŒsteemi konfiguratsiooni muuta.
Teiseks, lahendus oli hÀdasti vajalik.
KokkuvÔttes jÔudsime jÀreldusele, et peame tasakaalu muutma, vÀhendades failide arvu.
Failide arvu vĂ€hendamiseks otsustasime faile kokku panna ĂŒhte ĂŒhisesse arhiivi. Arvestades meie spetsiifikat, panime ĂŒhte arhiivi kĂ”ik failid teatud ajavahemiku jooksul ja teostasime arhiveerimise cron-ĂŒlesandega igal ööl.
Valisite zip-arhiivi. Eelmises artiklis pakuti vĂ€lja tar, kuid sellel on ĂŒks probleem: see ei sisalda sisukorda ja failid on seal jĂ€rjestikku (Ă€rge unustage, et «tar» on lĂŒhend «Tape Archive» ehk ribalĂ”ike pĂ€rand), seega kui soovite lugeda faili arhiivi lĂ”pus, tuleb lugeda kogu arhiiv, kuna seal pole failide asukohtade kohta niheteid. SeetĂ”ttu on see aeglane protsess. Zipis on asjad palju paremad: tal on see sisukord ja failide nihked arhiivi sees, ning juurdepÀÀsu aeg igale failile ei sĂ”ltu selle asukohast. Meie juhul vĂ”is seada tihendamise valiku «0», kuna kĂ”ik failid olid juba eelnevalt gzip'i sees tihendatud.
Kliendid vÔtavad faile nginx'i kaudu ja vanas API-s nÀidatakse lihtsalt faili nime, nÀiteks nii:
http://www.server.com/hydra/20170416/0453/3bd24ae7-1df4-4d76-9d28-5b7fcb7fd8e5
Kasutades faile otse lahti pakkida, leidsime ja lisasime nginx-unzip-module'i () ja seadistatud kaks upstream'i.
Tulemuseks sai selline konfiguratsioon:

Kaks hosti seadistustes nÀgid vÀlja nii:
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;
}
}
Ja upstream'i konfiguratsioon ĂŒlemisel nginx'il:
upstream storage {
server server.com:8081;
server server.com:8082;
}
Kuidas see töötab:
- Kliendi siseneb front nginx'i
- Front nginx ĂŒritab anda faili esimesest upstream'ist, st otse failisĂŒsteemist
- Kui faili ei ole â ĂŒritab anda teiselt upstream'ilt, mis pĂŒĂŒab leida faili arhiivi seest
Teine probleem: jÀlle «No space left on device»
See on teine probleem, millega me silmitsi seisame, kui kataloogis on palju faile.
PĂŒĂŒdleme faili luua, sĂŒsteem kurdab, et ruumi pole. Muudame faili nime ja proovime uuesti.
Saame hakkama.
Paistab vÀlja umbes nii:

Inode'ide kontroll ei andnud midagi â neid on palju vabu.
Ruuumi kontroll â sama asi.
MÔtlesime, et vÔib-olla on kataloogis liiga palju faile ja sellel on piirang, kuid taas ei ole: Kataloogis lubatud maksimaalne failide arv: ~1,3 à 10^20
Ja faili luua on vÔimalik, kui muuta nime.
JĂ€reldus â probleem on faili nimel.
Edasised otsingud nĂ€itavad, et probleem seisneb katalooge indekseerimise algoritmi hash-algoritmis, kus suurte failide arvuga tekivad kollisioonid kĂ”igi sellele jĂ€rgneva tagajĂ€rgedega. TĂ€iendavad ĂŒksikasjad leiate siit:
Seda valikut on vĂ”imalik vĂ€lja lĂŒlitada, kuid⊠faili leidmine nime jĂ€rgi vĂ”ib muutuda ettearvamatult pikaks, kui kĂ€iakse lĂ€bi kĂ”ik failid.
tune2fs -O "^dir_index" /dev/sdb3
Ăldiselt vĂ”ib see toimida ajutise lahendusena.
Moraal: palju faile kaustas on tavaliselt halb. Nii ei tohiks teha.
Tavaliselt sellistes olukordades luuakse sisemisi kaustu, kas faili nime esimeste tÀhtede jÀrgi vÔi mÔne muu parameetri, nÀiteks kuupÀevade jÀrgi, see pÀÀstab enamasti.
Aga ĂŒldine vĂ€ikeste failide arv on ikkagi halb, isegi kui need on jaotatud kaustadesse â siis vaata esimest probleemi.
Kolmas probleem: kuidas vaadata failide nimekirja, kui neid on palju
Meie olukorras, kui meil on palju faile, oleme paratamatult kokku puutunud probleemiga, kuidas vaadata kausta sisu.
Standardsed lahendus â kĂ€sk ls.
Okei, vaatame, mis juhtub 4772098 failiga:
$ time ls /home/app/express.repository/offercache/ >/dev/null
real 0m30.203s
user 0m28.327s
sys 0m1.876s
30 sekundit⊠see on liiga palju. Peamine aeg kulub failide töötlemiseks kasutaja ruumis, mitte tuuma tööle.
Aga lahendus on olemas:
$ time find /home/app/express.repository/offercache/ >/dev/null
real 0m3.714s
user 0m1.998s
sys 0m1.717s
3 sekundit. 10 korda kiiremini.
Jee!
UPD.
Kasutajalt veelgi kiirem lahendus â sortimise keelamine kĂ€skluses ls
time ls -U /home/app/express.repository/offercache/ >/dev/null
real 0m2.985s
user 0m1.377s
sys 0m1.608s
Neljas probleem: suur LA failidega töötamisel
Aeg-ajalt juhtub, et tuleb kopeerida palju faile ĂŒhest masinast teise. Sellega seoses suureneb sageli LA, kuna kĂ”ik sĂ”ltub ketaste jĂ”udlusest.
MĂ”istlik on kasutada SSD-d. See on tĂ”eliselt Ă€ge. KĂŒsimus on ainult mitme terabaidi SSD hindades.
Aga kui kettad on tavalised, tuleb faile kopeerida, ja see on veel tootmissĂŒsteem, kus ĂŒlekoormus viib klientide rahulolematuse juurde? On vĂ€hemalt kaks kasulikku tööriista: nice ja ionice.
nice â vĂ€hendab protsessi prioriteeti, seega jaotab planeerija rohkem aeglasi kvante teistele, prioriteetsematele protsessidele.
Meie praktikas on aidanud mÀÀrata nice'i maksimaalseks (19 â minimaalne prioriteet, -20 â maksimaalne).
ionice â vastavalt reguleerib sisendi/vĂ€ljundi prioriteeti (I/O planeerimine).
Kui teil on RAID ja see vajab Ă€kki sĂŒnkroonimist (pĂ€rast ebaĂ”nnestunud taaskĂ€ivitamist vĂ”i RAID-massiivi taastamist pĂ€rast ketta vahetust), siis teatud olukordades on mĂ”ttekas vĂ€hendada sĂŒnkroonimise kiirust, et teised protsessid saaksid enam-vĂ€hem korralikult töötada. Selle jaoks aitab jĂ€rgmine kĂ€sk:
echo 1000 > /proc/sys/dev/raid/speed_limit_max
Probleem viies: Kuidas sĂŒnkroonida faile reaalajas
Meil on kÔik need tohutud failihulgad, mida tuleb varundada teisele serverile⊠Failid kirjutatakse pidevalt, seega, et minimeerida kaotusi, tuleb neid maksimaalse kiirusel kopeerida.
Standardlahendus: Rsync SSH kaudu.
See on hea variant, kui sellega ei pea tegelema kord paari sekundi tagant. Ja faile on palju. Isegi kui neid ei kopeerita, tuleb kuidagi ikkagi mĂ”ista, mis on muutunud, ja vĂ”rrelda mitme miljoni faili â see vĂ”tab aega ja koormab kettaid.
Kuna meil on vaja kohe teada, mida kopeerida, ilma igal korral vÔrgu kÀivitamata.
PÀÀstmine â lsyncd. Lsyncd â . See töötab samuti rsynci kaudu, kuid jĂ€lgib lisaks failisĂŒsteemi muudatusi, kasutades inotify ja fsevents, ning kĂ€ivitab kopeerimise ainult nende failide jaoks, mis on tekkinud vĂ”i muutunud.
Probleem kuues: kuidas aru saada, kes koormab kettaid
Seda teavad ilmselt kĂ”ik, kuid tĂ€ieliku pildi saamiseks: diskisĂŒsteemi jĂ€lgimiseks on kĂ€sk iotop â sarnane top, kuid nĂ€itab protsesse, mis kasutavad kettaid kĂ”ige aktiivsemalt.

Muide, vana hea top aitab samuti aru saada, kas kettas on probleeme vÔi mitte. Selleks on kaks kÔige sobivamat parameetrit: Load Average ja IOwait.

Esimene nÀitab, mitu protsessi ootavad teenindamist; tavaliselt, kui see on rohkem kui 2, on juba midagi valesti. Aktiivse varundamise ajal lubame kuni 6-8, pÀrast seda loetakse olukord erakorraliseks.
Teine â kui palju protsessor on kettaoperatsioonidega hĂ”ivatud. IOwait >10% â pĂ”hjustab muret, kuigi meil on serverites, millel on spetsiifiline koormusprofiil, stabiilselt 40-50%, ja see on tĂ”eliselt normaalne.
Selle lÔpetan, kuigi kindlasti on palju aspekte, millega me pole kokku puutunud; ootan hea meelega kommentaare ja huvitavaid tÔelisi juhtumeid.
Allikas: habr.com
