Kui keskkonnamuutuja kiirendab protsessi 40 korda

TĂ€na tahame rÀÀkida mĂ”nest Sherlocki sĂŒsteemi viimastest uuendustest [see on Stanfordi ĂŒlikooli suure jĂ”udlusega klaster – u. trans.], mis kiirendavad oluliselt failide loetlemist suure hulga kirjetega kataloogides.

Erinevalt tavalistest artiklitest on see pigem siseringi aruanne selle kohta, kuidas me Sherlockiga regulaarselt töötame, et see meie kasutajate jaoks parimal viisil töötaks. Loodame tulevikus avaldada rohkem selliseid artikleid.

Paljude failide loetlemine vÔtab aega

KĂ”ik sai alguse kasutaja tehnilise toe kĂŒsimusest. Ta teatas hukkamise probleemist ls 15 000 kirjega kataloogis kulub paar minutit $SCRATCH [ajutiste failide kataloog - u. sĂ”idurada].

Tuhanded failid ĂŒhes kataloogis koormavad tavaliselt failisĂŒsteemi ja pole kindlasti soovitatav. Kasutaja teadis seda ja tunnistas, et see pole hea, kuid mainis, et loend oli tema sĂŒlearvutis 1000 korda kiirem kui Sherlock. Muidugi tegi see meile haiget. Nii et vaatasime sĂŒgavamalt.

Sest see nÀeb kena vÀlja

Vaatasime, mida see tegelikult teeb ls kataloogi loetlemisel ja miks see protsess nii kaua aega vÔtab. Enamikel kaasaegsetel distributsioonidel ls vaikimisi töötab see kui ls --color=auto, sest vÀrvid meeldivad kÔigile.

Kuid ilusatel vĂ€rvidel on oma hind: iga faili eest ls peab hankima teavet failitĂŒĂŒbi, selle Ă”iguste, lippude, laiendatud atribuutide jms kohta, et valida sobiv vĂ€rv.

Üks lihtne lahendus probleemile on keelata vĂ€rv ls-is tĂ€ielikult, kuid kujutage ette kasutajate pahameelt. Mitte mingil juhul ei tohi te vĂ€rvivĂ€ljundit Ă€ra vĂ”tta, me pole koletised.

Nii et vaatasime sĂŒgavamalt. ls vĂ€rvikirjed keskkonnamuutuja kaudu LS_COLORS, mis on mÀÀratud dircolors(1) konfiguratsioonifaili pĂ”hjal dir_colors(5)... Jah, kĂ€ivitatav fail loeb konfiguratsioonifaili, et luua keskkonnamuutuja, mida ls seejĂ€rel kasutab (ja kui te failidest ei tea uks (do), seejĂ€rel dir_colors töötab, Hoolimata kĂ”igest).

Vaatame lÀhemalt

Et teha kindlaks, milline vÀrviskeem pÔhjustab aeglustumist, lÔime eksperimentaalse keskkonna:

$ mkdir $SCRATCH/dont
$ touch $SCRATCH/dont/{1..10000} # don't try this at home!
$ time ls --color=always $SCRATCH/dont | wc -l
10000

real    0m12.758s
user    0m0.104s
sys     0m0.699s

12,7 sekundit 10 000 faili jaoks, mitte eriti hea.

Muide, me vajame lippu --color=always: kuigi ta pöördub poole ls --color=autoKuid ls tuvastab, kui see pole terminaliga ĂŒhendatud (nt toru kaudu vĂ”i vĂ€ljundi ĂŒmbersuunamisega) ja keelab vĂ€rvimise, kui see on mÀÀratud auto. Tark mees.

Mis siis nii kaua aega vÔtab? Vaatasime koos strace:

$ strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 44.21    0.186617          19     10000           lstat
 42.60    0.179807          18     10000     10000 getxattr
 12.19    0.051438           5     10000           capget
  0.71    0.003002          38        80           getdents
  0.07    0.000305          10        30           mmap
  0.05    0.000217          12        18           mprotect
  0.03    0.000135          14        10           read
  0.03    0.000123          11        11           open
  0.02    0.000082           6        14           close
[...]

Vau: 10 000 kÔnet lstat(), 10 000 kÔnet getxattr() (mis kÔik ebaÔnnestuvad, kuna meie keskkonnal pole atribuute, mida ls otsib), 10 000 kÔnet capget().

Kindlasti saab seda optimeerida.

VÔimaluste atribuut? Ei

NÔuannet jÀrgides viga 10 aastat tagasi, proovisime atribuutide kontrollimist keelata vÔimeid:

$ eval $(dircolors -b | sed s/ca=[^:]*:/ca=:/)
$ time strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 98.95    0.423443          42     10000           lstat
  0.78    0.003353          42        80           getdents
  0.04    0.000188          10        18           mprotect
  0.04    0.000181           6        30           mmap
  0.02    0.000085           9        10           read
  0.02    0.000084          28         3           mremap
  0.02    0.000077           7        11           open
  0.02    0.000066           5        14           close
[...]
------ ----------- ----------- --------- --------- ----------------
100.00    0.427920                 10221         6 total

real    0m8.160s
user    0m0.115s
sys     0m0.961s

Vau, kuni 8 sekundit kiirendust! Saime kÔigist nendest kallitest kÔnedest lahti getxattr()ja vÀljakutseid capget() kadus ka Àra, suurepÀrane.

Aga neid tĂŒĂŒtuid kĂ”nesid on ikka lstat(), kuigi


Kui palju lilli vajate?

SeetÔttu vaatasime lÀhemalt LS_COLORS.

Esmalt keelasime selle muutuja lihtsalt vÀlja:

$ echo $LS_COLORS
rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:
$ unset LS_COLORS
$ echo $LS_COLORS

$  time ls --color=always $SCRATCH/dont | wc -l
10000

real    0m13.037s
user    0m0.077s
sys     0m1.092s

Mida!?! Ikka 13 sekundit?

Selgub, et kui keskkonnamuutuja LS_COLORS ainult ĂŒks selle elementidest on mÀÀratlemata vĂ”i puudub <type>=color:, kasutab see vaikimisi sisseehitatud andmebaasi ja kasutab endiselt vĂ€rve. Nii et kui soovite teatud failitĂŒĂŒbi jaoks vĂ€rvimise keelata, peate selle alistama <type>=: vĂ”i <type> 00 failis DIR_COLORS.

PÀrast palju katse-eksitusi kitsendasime otsingut jÀrgmisele:

EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00

mis on kirjutatud kui

LS_COLORS='ex=00:su=00:sg=00:ca=00:'

See tÀhendab: Àrge vÀrvige faile atribuudi jÀrgi. vÔimeid, aga vÀhehaaval setuid/setgid, ka mitte tÀitmisvÔime lipp.

Me kiirendame ls

Ja kui te ĂŒhtegi neist kontrollidest ei tee, helistage lstat() kaovad ja nĂŒĂŒd on asi hoopis teine:

$ export LS_COLORS='ex=00:su=00:sg=00:ca=00:'
$ time strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 63.02    0.002865          36        80           getdents
  8.10    0.000368          12        30           mmap
  5.72    0.000260          14        18           mprotect
  3.72    0.000169          15        11           open
  2.79    0.000127          13        10           read
[...]
------ ----------- ----------- --------- --------- ----------------
100.00    0.004546                   221         6 total

real    0m0.337s
user    0m0.032s
sys     0m0.029s

0,3 sekundit 10 000 failiga loendis, rekord.

Sherlocki seadistamine

Alates 13 sekundist vaikeseadetega kuni 0,3 sekundini vĂ€ikeste muudatustega LS_COLORS tĂ€hendab puudumise tĂ”ttu 40-kordset kiirendust setuid / setgid ja vĂ€rvilised kĂ€ivitatavad failid. Pole nii suur kaotus.

Loomulikult on see nĂŒĂŒd Sherlockis iga kasutaja jaoks konfigureeritud.

Kuid kui soovite vÀrvi taastada, saate lihtsalt naasta vaikeseadetele:

$ unset LS_COLORS

Kuid kataloogides, kus on palju faile, keetke kindlasti kohvi töötamise ajal ls.

Allikas: www.habr.com

Ostke DDoS-kaitsega saitide jaoks usaldusvÀÀrne hostimine, VPS VDS-serverid đŸ”„ Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega, VPS VDS serverid | ProHoster