Hacks biex taħdem ma 'numru kbir ta' fajls żgħar

L-idea tal-artiklu twieldet spontanjament minn diskussjoni fil-kummenti tal-artiklu "Xi ħaġa dwar inode".

Hacks biex taħdem ma 'numru kbir ta' fajls żgħar

Il-fatt hu li l-ispeċifiċità interna tas-servizzi tagħna hija l-ħażna ta 'numru kbir ta' fajls żgħar. Bħalissa għandna madwar mijiet ta 'terabytes ta' data bħal din. U ltqajna ma' xi rakes ovvji u mhux daqshekk ovvji u nnavigajnahom b'suċċess.

Għalhekk, qed naqsam l-esperjenza tagħna, forsi tkun utli għal xi ħadd.

Problema waħda: "M'hemmx spazju fuq it-tagħmir"

Kif imsemmi fl-artikolu msemmi hawn fuq, il-problema hija li hemm blokki ħielsa fuq is-sistema tal-fajls, iżda l-inode spiċċa.

Tista 'tiċċekkja n-numru ta' inodes użati u ħielsa bil-kmand df -ih:

Hacks biex taħdem ma 'numru kbir ta' fajls żgħar

Mhux se ngħid mill-ġdid l-artiklu; fil-qosor, id-diska fiha kemm blokki għad-dejta nnifisha kif ukoll blokki għall-meta-informazzjoni, magħrufa wkoll bħala inodes (node ​​tal-indiċi). In-numru tagħhom huwa ssettjat meta s-sistema tal-fajls tiġi inizjalizzata (qed nitkellmu dwar ext2 u s-suċċessuri tagħha) u ma jinbidelx aktar. Il-bilanċ tal-blokki tad-dejta u l-inodi huwa kkalkulat mid-dejta statistika medja, iżda fil-każ tagħna, meta jkun hemm ħafna fajls żgħar, il-bilanċ għandu jinbidel lejn in-numru ta 'inodi - għandu jkun hemm aktar minnhom.

В Linux Diġà pprovdejna għażliet b'bilanċi differenti, u dawn il-konfigurazzjonijiet kollha kkalkulati minn qabel jinsabu fil-fajl /etc/mke2fs.conf.
Għalhekk, matul l-inizjalizzazzjoni tas-sistema tal-fajls permezz ta 'mke2fs, tista' tispeċifika l-profil mixtieq.

Hawn huma xi eżempji mill-fajl:

    small = {
        blocksize = 1024
        inode_size = 128
        inode_ratio = 4096
    }

    big = {
        inode_ratio = 32768
    }

    largefile = {
        inode_ratio = 1048576
        blocksize = -1
    }

Tista 'tagħżel il-każ ta' użu mixtieq billi tuża l-għażla "-T" meta ssejjaħ mke2fs. Tista 'wkoll issettja manwalment il-parametri meħtieġa jekk ma jkunx hemm soluzzjoni lesta.

Aktar dettalji huma deskritti fil-manwali għal mke2fs.conf и mke2fs.

Karatteristika li ma ntmissx fl-artikolu msemmi hawn fuq hija li tista 'tissettja d-daqs tal-blokka tad-dejta. Ovvjament, għal fajls kbar jagħmel sens li jkun hemm daqs tal-blokk akbar, għal fajls żgħar jagħmel sens li jkun hemm waħda iżgħar.

Madankollu, ta 'min jikkunsidra karatteristika daqstant interessanti bħall-arkitettura tal-proċessur.
Darba ħsibt li għal fajls tar-ritratti kbar kelli bżonn daqs tal-blokk akbar. Dan ġara fid-dar, fuq maħżen tal-fajls tad-dar jismu WD fuq l-arkitettura ARM. Mingħajr eżitazzjoni, issettja d-daqs tal-blokk għal jew 8k jew 16k minflok l-istandard 4k, wara li qabel imkejjel l-iffrankar. U kollox kien tajjeb sakemm il-ħażna nnifisha falliet, u d-disk kien għadu ħaj. Wara li installajt id-diska f'kompjuter regolari bi proċessur Intel regolari, sibt sorpriża: daqs tal-blokk mhux appoġġjat. Wasalna. Id-dejta qiegħda hemm, kollox tajjeb, iżda huwa impossibbli li taqra. i386 u proċessuri simili ma jistgħux jaħdmu b'daqsijiet ta 'blokki li ma jikkorrispondux mad-daqs tal-paġna tal-memorja, li hija eżattament 4k. B'mod ġenerali, il-kwistjoni spiċċat bl-użu ta 'utilitajiet mill-ispazju tal-utent, kollox kien bil-mod u imdejjaq, iżda d-dejta ġiet salvata. Jekk xi ħadd hu interessat, google l-isem tal-utilità fuseext2. Morali: jew taħseb fil-każijiet kollha minn qabel, jew tippretendix li tkun supereroj u tuża settings standard għan-nisa tad-dar.

UPD. Skont il-kumment tal-utent berez Nixtieq niċċara li għal i386 id-daqs tal-blokk m'għandux jaqbeż l-4k, iżda m'għandux għalfejn ikun eżattament 4k, i.e. 1k u 2k huma aċċettabbli.

Allura, kif solvejna l-problemi?

L-ewwelnett, iltqajna ma 'problema meta disk multi-terabyte kien mimli dejta, u ma stajniex nibdlu l-konfigurazzjoni tas-sistema tal-fajls.

It-tieni, kienet meħtieġa soluzzjoni b'mod urġenti.

Bħala riżultat, wasalna għall-konklużjoni li rridu nbiddlu l-bilanċ billi nnaqqsu n-numru ta 'fajls.
Biex jitnaqqas in-numru ta' fajls, ġie deċiż li l-fajls jitpoġġew f'arkivju komuni wieħed. B'kont meħud tal-ispeċifiċitajiet tagħna, aħna poġġejna l-fajls kollha fuq ċertu perjodu ta 'żmien f'arkivju wieħed, u wettaqna l-arkivjar bl-użu ta' kompitu cron kull lejl.

Arkivju zip magħżul. Fil-kummenti għall-artikolu preċedenti, il-qatran ġie ssuġġerit, iżda hemm diffikultà waħda magħha: m'għandux sommarju, u l-fajls fih huma maħżuna fi fluss (mhux biss li "qatran" hija abbrevjazzjoni għal “Tape Archive”, il-wirt ta’ tape drives), i.e. jekk għandek bżonn taqra fajl fl-aħħar tal-arkivju, trid taqra l-arkivju kollu, peress li ma fihx offsets għal kull fajl relattiv għall-bidu tal-arkivju. U għalhekk hija operazzjoni twila. Kollox huwa ħafna aħjar f'zip: għandu l-istess sommarju u l-offsets tal-fajls fl-arkivju, u l-ħin ta 'aċċess għal kull fajl ma jiddependix fuq il-post tiegħu. Ukoll, fil-każ tagħna, kien possibbli li l-għażla tal-kompressjoni tiġi stabbilita għal "0", minħabba li l-fajls kollha kienu diġà kkompressati f'gzip minn qabel.

Il-klijenti jirkupraw fajls permezz ta 'nginx, u skont l-API l-antika, huwa speċifikat biss l-isem tal-fajl, pereżempju bħal dan:

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

Biex nippakkjaw il-fajls fuq il-fly, sibna u kkonnettja l-modulu nginx-unzip-module (https://github.com/youzee/nginx-unzip-module) u waqqaf żewġ upstreams.

Ir-riżultat kien il-konfigurazzjoni li ġejja:

Hacks biex taħdem ma 'numru kbir ta' fajls żgħar

Iż-żewġ hosts fis-settings dehru bħal dan:

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;
  }
}

U l-konfigurazzjoni upstream fuq nginx upstream:

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

Kif taħdem:

  • Il-klijent imur quddiem nginx
  • Front nginx jipprova jservi l-fajl mill-ewwel upstream, i.e. direttament mis-sistema tal-fajls
  • Jekk ma jkunx hemm fajl, jipprova jibgħat mit-tieni upstream, li jipprova jsib il-fajl ġewwa l-arkivju

Problema tnejn: għal darb'oħra "M'hemmx spazju fuq it-tagħmir"

Din hija t-tieni problema li ltqajna magħhom meta jkun hemm ħafna fajls f'direttorju.
Qed nippruvaw noħolqu fajl, is-sistema tilmenta li m'hemmx spazju. Aħna nibdlu l-isem tal-fajl u nippruvaw noħolqu mill-ġdid.

Jirriżulta.

Jidher xi ħaġa bħal din:

Hacks biex taħdem ma 'numru kbir ta' fajls żgħar

L-iċċekkjar tal-inodes ma tat xejn - hemm ħafna dawk b'xejn.
L-iċċekkjar tal-post huwa l-istess.
Ħsibna li jista 'jkun hemm wisq fajls fid-direttorju, u hemm limitu fuq dan, iżda għal darb'oħra le: Numru massimu ta' fajls għal kull direttorju: ~1.3 × 10^20

Iva, u tista' toħloq fajl jekk tibdel l-isem.
Konklużjoni - il-problema tinsab fl-isem tal-fajl.

Tfittxijiet ulterjuri wrew li l-problema tinsab fl-algoritmu tal-hashing meta jinbena l-indiċi tad-direttorju; b'numru kbir ta 'fajls, ħabtiet huma osservati bil-konsegwenzi kollha li jirriżultaw. Tista' taqra aktar dettalji hawn: https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#Hash_Tree_Directories

Tista' tiddiżattiva din l-għażla, iżda... it-tiftix għal fajl bl-isem jista' jsir twil b'mod imprevedibbli meta wieħed ifittex mill-fajls kollha.

 tune2fs -O "^dir_index" /dev/sdb3

B'mod ġenerali, din hija soluzzjoni temporanja li tista' taħdem.

Morali: ħafna fajls f'direttorju ġeneralment tkun ħaġa ħażina. M'hemmx għalfejn tagħmel dan.

Normalment f'każijiet bħal dawn, direttorji nested huma maħluqa mill-ewwel ittri tal-isem tal-fajl jew minn xi parametri oħra, pereżempju, bid-dati, f'ħafna każijiet dan jiffranka l-ġurnata.
Iżda n-numru totali ta 'fajls żgħar għadu ħażin, anki jekk huma maqsuma f'direttorji - imbagħad ara l-ewwel problema.

Problema tlieta: kif tara l-lista ta 'fajls jekk hemm ħafna minnhom

Fis-sitwazzjoni tagħna, meta jkollna ħafna fajls, b'xi mod jew ieħor iffaċċjajna l-problema ta 'kif tara l-kontenut tad-direttorju.

Soluzzjoni standard - kmand ls.
Ok, ejja naraw x'jiġri fuq 4772098 fajls:


$ time ls /home/app/express.repository/offercache/ >/dev/null

real	0m30.203s
user	0m28.327s
sys	0m1.876s

30 sekonda... se jkunu wisq. Barra minn hekk, ħafna mill-ħin jintefaq fuq l-ipproċessar tal-fajls fl-ispazju tal-utent, u xejn fuq l-operat tal-qalba.

Iżda hemm soluzzjoni:


$ time find /home/app/express.repository/offercache/ >/dev/null

real	0m3.714s
user	0m1.998s
sys	0m1.717s

3 sekondi. 10 darbiet aktar mgħaġġla.
Hooray!

UPD.

Soluzzjoni saħansitra aktar mgħaġġla mill-utent berez - tiddiżattiva l-issortjar ls


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

Problema erbgħa: LA kbira meta taħdem ma 'fajls

Minn żmien għal żmien tqum sitwazzjoni meta jkollok bżonn tikkopja mazz ta 'fajls minn magna għal oħra. Fl-istess ħin, LA ħafna drabi tikber b'mod mhux realistiku, peress li kollox jiddependi fuq il-prestazzjoni tad-diski nfushom.

L-iktar ħaġa intelliġenti li trid tagħmel hu li tuża SSD. Verament jibred. L-unika mistoqsija hija l-ispiża ta 'SSDs multi-terabyte.

Imma jekk id-diski huma ordinarji, għandek bżonn tikkopja fajls, u din hija wkoll sistema ta 'produzzjoni, fejn tagħbija żejda twassal għal esklamazzjonijiet mhux sodisfatti mill-klijenti? Hemm mill-inqas żewġ għodod utli: nice и ionice.

nice — inaqqas il-prijorità tal-proċess, għalhekk l-iskeder iqassam aktar biċċiet tal-ħin lil proċessi oħra ta' prijorità ogħla.
Fil-prattika tagħna, għen biex tissettja sbieħ għall-massimu (19 hija l-prijorità minima, -20 (nieqes 20) hija l-massimu).

ionice — taġġusta l-iskedar tal-I/O kif xieraq

Jekk qed tuża RAID u f'daqqa waħda jeħtieġ li tkun sinkronizzata (wara reboot bla suċċess jew ikollok bżonn tirrestawra l-firxa RAID wara li tissostitwixxi disk), allura f'xi sitwazzjonijiet jagħmel sens li titnaqqas il-veloċità tas-sinkronizzazzjoni sabiex proċessi oħra jkunu jistgħu jaħdmu aktar jew inqas adegwatament. Il-kmand li ġej se jgħin għal dan:


echo 1000 > /proc/sys/dev/raid/speed_limit_max

Problema ħamsa: Kif tissinkronizza l-fajls f'ħin reali

Għad għandna l-istess numru kbir ta 'fajls li jeħtieġ li jiġu appoġġjati għat-tieni server biex jiġi evitat... Il-fajls qed jinkitbu kontinwament, għalhekk sabiex ikollok minimu ta' telf, trid tikkopjahom malajr kemm jista 'jkun.

Soluzzjoni standard: Rsync fuq SSH.

Din hija għażla tajba sakemm ma jkollokx bżonn tagħmel dan kull ftit sekondi. U hemm ħafna fajls. Anke jekk ma tikkopjahomx, xorta trid tifhem b'xi mod dak li nbidel, u t-tqabbil ta 'bosta miljun fajl jieħu ż-żmien u t-tagħbija fuq id-diski.

Dawk. għandna bżonn inkunu nafu immedjatament x'għandu jiġi kkupjat, mingħajr ma nagħmel paragun kull darba.

Is-salvataġġ - lsyncd. Lsyncd - Sinkronizzar Live (Mirror) Daemon. Jaħdem ukoll permezz ta 'rsync, iżda barra minn hekk jimmonitorja s-sistema tal-fajls għal bidliet bl-użu ta' inotify u fsevents u jibda biss jikkopja dawk il-fajls li dehru jew inbidlu.

Problema sitt: kif tifhem min qed jgħabbi d-diski

Kulħadd probabbilment jaf dan, iżda madankollu, biex tlesti l-istampa: hemm kmand biex tissorvelja s-subsistema tad-diska iotop - bħal top, iżda juri l-proċessi li qed jużaw l-aktar diski b'mod attiv.

Hacks biex taħdem ma 'numru kbir ta' fajls żgħar

Mill-mod, il-quċċata antik tajba tippermetti wkoll li tifhem jekk hemmx problema bid-diski jew le. Hemm żewġ għażliet l-aktar adattati għal dan: Tagħbija Medja и IOstenna.

Hacks biex taħdem ma 'numru kbir ta' fajls żgħar

L-ewwel turi kemm hemm proċessi fil-kju għas-servizz, ġeneralment aktar minn 2 - xi ħaġa diġà sejra ħażin. Meta tikkopja b'mod attiv għal servers ta 'backup, inħallu sa 6-8, u wara s-sitwazzjoni titqies anormali.

It-tieni huwa kemm il-proċessur huwa okkupat bl-operazzjonijiet tad-disk. IOwait> 10% huwa kawża ta 'tħassib, għalkemm fuq is-servers tagħna bi profil ta' tagħbija speċifiku huwa konsistenti 40-50%, u dan huwa verament in-norma.

Nispiċċa hawn, għalkemm probabbilment hemm ħafna punti li ma kellniex nittrattaw magħhom, inkun kuntent nistenna kummenti u deskrizzjonijiet ta 'każijiet reali interessanti.

Sors: www.habr.com

Ixtri hosting affidabbli għal siti bi protezzjoni DDoS, servers VPS VDS 🔥 Ixtri hosting ta' websajts affidabbli bi protezzjoni DDoS, servers VPS VDS | ProHoster