Tööd suure arvu vÀikeste failidega

Artikli idee sĂŒndis spontaanselt kommentaaride arutelust artikli all „MĂ”ned asjad inode'ist“.

Tööd suure arvu vÀikeste failidega

Asi on selles, et meie teenuste sisemise töö eripĂ€ra on tohutu arvu vĂ€ikeste failide sĂ€ilitamine. Praeguseks on meil umbes sadu terabaite selliseid andmeid. Oleme kohtunud mitmete ilmselgete ja vĂ€hem ilmselgete takistustega ning oleme neist edukalt ĂŒle saanud.

Seega jagan meie kogemusi, ehk on kellelegi kasulik.

Esimene probleem: "Seade pole rohkem ruumi"

Nagu mainitud eelmises artiklis, on probleem selles, et failisĂŒsteemis on tasuta bloke, kuid inode'id on otsa saanud.

Kasutatud ja vabu inode'e saab kontrollida kÀsuga df -ih:

Tööd suure arvu vÀikeste failidega

Ma ei hakka artiklit ĂŒmber jutustama, kuid lĂŒhidalt, kettal on nii andmete plokid kui ka meta-informatsiooni plokid, mida nimetatakse ka inodes (indeksi sĂ”lmed). Nende arv mÀÀratakse failisĂŒsteemi initsialiseerimise kĂ€igus (juttu on ext2-st ja selle jĂ€reltulijatest) ning edaspidi ei muutu. Andmeplokkide ja inodide tasakaal arvutatakse keskmiste andmete pĂ”hjal, meie juhul, kui on palju vĂ€ikeseid faile, peaks tasakaal nihkuma inodide arvu suunas — neid peab olema rohkem.

Linuxis on juba ette nÀhtud erineva tasakaalu variandid, ja kÔik need eelnevalt arvutatud konfiguratsioonid asuvad failis /etc/mke2fs.conf.
Seega saab failisĂŒsteemi algse initsialiseerimise kĂ€igus mke2fs kaudu mÀÀrata vajaliku 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 kasutusvariandi valimiseks saab kasutada valikku «-T» mke2fs kÀivitamisel. Samuti vÔib vajaduse korral kÀsitsi mÀÀrata vajalikud parameetrid, kui valmis lahendust pole.

Rohkem ĂŒksikasju on kirjas manuaalides mke2fs.conf ja mke2fs.

Üks pĂ”hjusi, mida eespool mainitud artiklis ei kĂ€sitletud — on andmeploki suuruse mÀÀramine. Ilmselgelt on suurte failide jaoks mĂ”ttekas kasutusele vĂ”tta suurem plokk, vĂ€ikeste jaoks aga vĂ€iksem.

Kuid tasub arvestada sellise huvitava aspektiga nagu protsessori arhitektuur.
Kordagi mĂ”tlesin, et suurte piltfailide jaoks on mul vaja suuremat plokki. Asi toimus kodus, WD nime all tuntud kodu failiserveris ARM-arhitektuuril. MĂ”tlesin ja mÀÀrasin ploki suuruseks kas 8k vĂ”i 16k tavalise 4k asemel, eelnevalt mÔÔtes, kui palju saan kokku hoida. Ja kĂ”ik oli suurepĂ€rane, kuni server lĂ”petas töötamise, kuigi kett oli elus. Kui panin ketta tavalisest arvutisse Inteli protsessoriga, sain ĂŒllatuse: mitte toetatud ploki suurus. Andmed olid olemas, kĂ”ik oli korras, kuid lugeda ei saanud. Protsessorid i386 ja sarnased ei oska töötada plokkide suurustega, mis ei vasta mĂ€lulehe suurusele, see on tĂ€pselt 4k. KokkuvĂ”ttes lĂ”ppes kĂ”ik kasutajarekvisiitide utiliitide abil, see oli aeglane ja kurb, kuid andmed saadi siiski kĂ€tte. Kellele huvi pakub — otsige utiliidi nime jĂ€rgi. fuseext2. Moraal: kas tuleb kĂ”ik juhtumid ette mĂ”elda vĂ”i mitte pĂŒĂŒda end superkangelasena esitada ja kasutada standardseid seadeid koduperenaiste jaoks.

UPD. Kasutaja mĂ€rkusele berez Selgitan, et i386 jaoks ei tohiks ploki suurus ĂŒletada 4k, kuid see ei pruugi tingimata olla tĂ€pselt 4k, st lubatud on ka 1k ja 2k.

Nii et, kuidas me probleemidega hakkama saime.

Esiteks sattusime probleemiga kokku, kui mitme terabaidi kĂ”vaketas oli andmetest pungil, ja me ei saanud failisĂŒsteemi konfiguratsiooni muuta.

Teiseks oli lahendus hÀdasti vajalik.

KokkuvÔttes jÔudsime jÀreldusele, et peame tasakaalu muutma, vÀhendades failide arvu.
Failide arvu vĂ€hendamiseks otsustasime koguda kĂ”ik failid ĂŒheks arhiviks. Arvestades meie eripĂ€ra, kogusime ĂŒhe arhiivi kĂ”ik failid teatud ajavahemiku jooksul ja tegime arhiveerimise cron-tĂ¶Ă¶ĂŒlesandena igal ööl.

Valisite zip-arhiivi. Eelmises artiklis soovitati tar'u, kuid sellel on ĂŒks probleem: see ei sisalda sisukorda ning failid on seal voogesitusena (mitte juhuslikult - „tar“ on lĂŒhend „Tape Archive“, mis pĂ€rineb lintkettasid kasutamisest), st kui soovite lugeda faili arhiivi lĂ”pus, peate lugema kogu arhiivi, kuna seal ei ole nihkeid iga faili jaoks arhiivi algusest. SeetĂ”ttu on see aeganĂ”udev protsess. Zip-formaadis on asjad palju paremad: see sisaldab just seda sisukorda ja failide nihkeid arhiivi sees, mistĂ”ttu on iga faili juurde pÀÀsemise aeg sĂ”ltumatu selle asukohast. Meie puhul oleks me vĂ”inud mÀÀrata ka „0“ tihendamisvaliku, kuna kĂ”ik failid olid juba eelnevalt gzip-iga kokku pakitud.

Kliendid saavad faile kÀtte nginx'i kaudu, ja vastavalt vanale API-le antakse lihtsalt faili nimi, nÀiteks nii:

http://www.server.com/hydra/20170416/0453/3bd24ae7-1df4-4d76-9d28-5b7fcb7fd8e5

Et faile reaalajas lahti pakkida, leidsime ja ĂŒhendasime nginx-unzip-module'i (https://github.com/youzee/nginx-unzip-module) ja konfigureerisime kaks upstream'i.

Tulemusena sai selline konfigureerimine:

Tööd suure arvu vÀikeste failidega

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 tĂ”ukserverite konfiguratsioon ĂŒlemisel nginx-il:

upstream storage {
  server server.com:8081;
  server server.com:8082;
}

Kuidas see töötab:

  • Kliendit lĂ€heb front nginx-i
  • Front nginx pĂŒĂŒab anda faili esimesest tĂ”ukurist, st otse failisĂŒsteemist
  • Kui faili pole — pĂŒĂŒab anda teisest tĂ”ukurist, mis pĂŒĂŒab faili leida arhiivi seest

Teine probleem: jÀlle "No space left on device"

See on teine probleem, millega me silmitsi seisame, kui kataloogis on palju faile.
Proovime faili luua, sĂŒsteem protestib, et ruumi pole. Muudame faili nime ja proovime jĂ€lle luua.

Saame hakkama.

Tundub umbes nii:

Tööd suure arvu vÀikeste failidega

Inodes'i kontrollimine ei andnud midagi — neid on palju vabade.
RĐŸĐŒĐž kontrollimisest — sama asi.
MĂ”tleme, et vĂ”ib-olla on kataloogis liiga palju faile ja sellel on piirang, kuid ei: Maksimaalne failide arv kataloogis: ~1.3 × 10^20

Ja faili saab luua, kui nime muudetakse.
JĂ€reldus — probleem on faili nimes.

Edasised uuringud nÀitasid, et probleem on katalooge indekseerimise ajal kasutatavates hash-algoritmides, millega suures failihulgas tekivad konfliktid ning kÔik sellest tulenevad tagajÀrjed. TÀiendavaid andmeid leiate siit: https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#Hash_Tree_Directories

Selle valiku vĂ”ib vĂ€lja lĂŒlitada, kuid... faili leidmine nime pĂ”hjal vĂ”ib muutuda ettearvamatult pikaajaliseks, kui tuleb lĂ€bi kĂ€ia kĂ”ik failid.

 tune2fs -O "^dir_index" /dev/sdb3

Üldiselt vĂ”ib see ajutise lahendusena töötada.

Moraal: palju faile kataloogis on tavaliselt halb. Nii ei tohi teha.

Tavaliselt luuakse sellistes olukordades sisemised kataloogid, faili nime esialgsete tÀhtede vÔi mÔne muu parameetri, nÀiteks kuupÀevade jÀrgi, enamasti pÀÀstab see olukorra.
Kuid vĂ€ikeste failide arv on ikkagi halb, isegi kui need on jagatud kataloogidesse — sel juhul vaadake esimest probleemi.

Kolmas probleem: kuidas vaadata, kui faile on palju

Meie olukorras, kus meil on palju faile, oleme varem vÔi hiljem silmitsi seisnud probleemiga, kuidas vaadata katalooge.

Standardslahendus — 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
 liiga palju. Ja 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. KĂŒmme korda kiirem.
Hurraa!

UPD.

Veelgi kiirem lahendus kasutajalt berez — sortimise keelamine ls


time ls -U /home/app/express.repository/offercache/ >/dev/null
real	0m2.985s
user	0m1.377s
sys	0m1.608s

Probleem neli: suur LA failidega töötamisel

Aeg-ajalt tekib olukord, kus on vaja kopeerida hulk faile ĂŒhest masinast teise. Sellegipoolest tĂ”useb LA sageli ebanormaalselt kĂ”rgeks, kuna kĂ”ik sĂ”ltub ketaste jĂ”udlusest.

KĂ”ige mĂ”istlikum, mida soovitakse — kasutada SSD-d. Tegelikult Ă€ge. Ainult hindadega suure mahutavusega SSD-de osas on kĂŒsimus.

Aga kui kettad on tavalised, siis faile on vaja kopeerida ja see on samas ka tootmissĂŒsteem, kus koormus pĂ”hjustab rahulolematust klientide seas? On vĂ€hemalt kaks kasulikku tööriista: nice ja ionice.

nice — vĂ€hendab protsessi prioriteeti, vastavalt sellele planeerija jagab rohkem aega teistele, kĂ”rgema prioriteediga protsessidele.
Meie praktikas aitas mÀÀrata nice maksimaalselt (19 — see on minimaalne prioriteet, -20 (miinus 20) — maksimaalne).

ionice — vastavalt kohandab sisse- / vĂ€ljuvate andmete prioriteeti (I/O planeerimine)

Kui teil on RAID ja see vajab Ă€kki sĂŒnkroonimist (kui taaskĂ€ivitamine ebaĂ”nnestus vĂ”i tuleb RAID-massiivi taastamine pĂ€rast ketta vahetamist), siis mĂ”nes olukorras on mĂ”ttekas vĂ€hendada sĂŒnkroonimise kiirus, et teised protsessid saaksid enam-vĂ€hem adekvaatselt 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

Kasutame kÔiki neid tohutuid failihulki, mida tuleb varundada teisele serverile, et vÀltida... Faile kirjutatakse pidevalt, seetÔttu tuleb neid kopeerida nii kiiresti kui vÔimalik, et minimeerida kaotusi.

Standardlahendus: Rsync ĂŒle SSH.

See on hea variant, kui seda ei pea tegema iga paari sekundi jĂ€rel. Ja faile on palju. Isegi kui neid ei kopeerita — tuleb mingil moel ikkagi aru saada, mis on muutunud, ja vĂ”rrelda mitme miljoni faili vahel — see on aega ja koormust kettale.

See, me peame kohe teadma, mida kopeerida, ilma et iga kord vÔrreldakse.

PÀÀstmine — lsyncd. Lsyncd — Elus sĂŒnkroonimise (peegli) deemon. See töötab ka rsynci kaudu, kuid lisaks jĂ€lgib see failisĂŒsteemi muudatusi inotify ja fsevents abil ning kĂ€ivitab kopeerimise ainult nende failide jaoks, mis on loodud vĂ”i muudetud.

Kuues probleem: kuidas mÔista, kes koormab kettad

Seda teavad tĂ”enĂ€oliselt kĂ”ik, kuid tĂ€ieliku pildi jaoks: kettasĂŒsteemi jĂ€lgimiseks on kĂ€sk iotop — midagi sarnast top, kuid see nĂ€itab kĂ”ige aktiivsemalt kettaid kasutavaid protsesse.

Tööd suure arvu vÀikeste failidega

Muide, vana hea top aitab samuti mÔista, kas kettad on probleemsed. Kord, milleks on kaks sobivamat parameetrit: Load Average ja IOwait.

Tööd suure arvu vÀikeste failidega

Esimene nĂ€itab, kui palju protsesse ootavad teenindamist, tavaliselt ĂŒle 2 on juba murettekitav. Aktiivse kopeerimise korral varundusse lubame kuni 6-8, pĂ€rast seda peetakse olukorda ebanormaalseks.

Teine – kui palju protsessor on kettaoperatsioonidega hĂ”ivatud. IOwait >10% – on pĂ”hjust muretseda, kuigi meie serverites, kus on spetsiifiline koormuse profiil, on see pĂŒsivalt 40-50%, ja see on tĂ”eliselt norm.

Selle lÔpetan, kuigi kindlasti on palju hetki, millega me pole silmitsi seisnud, ootan huviga kommentaare ja huvitavaid tÔelisi juhtumeid.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster