Kui keskkonnamuutuja kiirendab protsessi 40 korda

TĂ€na tahame rÀÀkida mĂ”nest uuest vĂ€rskendusest Sherlocki sĂŒsteemis [see on Stanfordi ĂŒlikooli kĂ”rge jĂ”udlusega klaster — tĂ”lkija mĂ€rkus], mis kiirendab oluliselt failide loetlemist kataloogides, kus on palju kirjeid.

Erinevalt tavalisest artiklist on see pigem insideri aruanne, kuidas kÀib regulaarne töö Sherlocki kallal, et hoida see meie kasutajatele parimas korras. Loodame tulevikus avaldada rohkem selliseid artikleid.

Paljude failide loetlemine vÔtab aega

KĂ”ik algas kasutaja tugiteenuse kĂŒsimusest. Ta teatas, et kĂ€itamine ls vĂ”tab kataloogis, kus on ĂŒle 15 000 kirje, mitu minutit $SCRATCH [ajutiste failide kataloog — tĂ”lkija mĂ€rkus].

Tuhanded failid ĂŒhes kataloogis pĂ”hjustavad tavaliselt failisĂŒsteemile raskusi ja seda ei soovitata. Kasutaja teadis seda ja tunnustas, et see ei ole hea, kuid mainis, et tema sĂŒlearvutis toimub loetlemine 1000 korda kiiremini kui Sherlockis. Loomulikult oli see meid Ă€rritanud. SeetĂ”ttu uurisime sĂŒgavamalt.

Sest ls nÀeb ilus vÀlja

Oleme uurinud, mida tegelikult teeb ls katalooge loetlev protsess ja miks see aega vÔtab. Enamikul tÀnapÀevastest jaotustest ls kÀivitatakse vaikimisi kui ls --color=auto, sest kÔik armastavad vÀrve.

Aga ilusad vĂ€rvid maksavad midagi: iga faili ls peab saama teavet faili tĂŒĂŒbi, selle Ă”iguste, lipukeste, laiendatud atribuudide jne kohta, et valida sobiv vĂ€rv.

Üks lihtsamaid lahendusi probleemile on ĂŒldiselt vĂ€rvi vĂ€lja lĂŒlitamine, aga kujutage ette, kui palju kasutajad oleksid pahased. VĂ€rvilise vĂ€ljundi Ă€ravĂ”tmine pole mingil juhul aktsepteeritav, me ei ole monsterid.

Seega uurisime sĂŒgavamale. ls vĂ€rviliselt mĂ€rgib kirjeid keskkonnamuutuja LS_COLORS, mille mÀÀrab dircolors(1) konfiguratsioonifailist dir_colors(5). Jah, tĂ€idetav fail loeb konfiguratsioonifaili, et luua keskkonnamuutujat, mida seejĂ€rel kasutab ls (ja kui te ei tea failidest door (do), siis dir_colors töötab, hoolimata kĂ”ikidest takistustest).

Vaatame lÀhemalt

Kuna vÀlja selgitada, milline vÀrviskeem aeglustab, lÔime eksperimenteerimiskeskkonna:

$ mkdir $SCRATCH/dont
$ touch $SCRATCH/dont/{1..10000} # Àrge proovige seda kodus!
$ time ls --color=always $SCRATCH/dont | wc -l
10000

reaalne    0m12.758s
kasutaja    0m0.104s
sĂŒsteem     0m0.699s

12,7 sekundit 10 000 faili jaoks, mitte just vÀga hÀsti.

Muide, on vaja lippu --color=always: kuigi see muutub ls --color=auto, aga ls tuvastab, kui see ei ole ĂŒhendatud terminaliga (nt ĂŒle kanali vĂ”i vĂ€ljundi suunamise kaudu) ja keelab vĂ€rvi, kui vÀÀrtus on auto. Nutikas poiss.

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

$ strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% aeg     sekundid  mikrosekundit/kĂ”ne     kĂ”ned    vead sĂŒsteemikutsed
------ ----------- ----------- --------- --------- ----------------
 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
[...]

Oho: 10 000 kutset lstat(), 10 000 kutset getxattr() (kÔik ebaÔnnestuvad, sest meie keskkonnas ei ole atribuutide otsimiseks vajalikku ls-i), 10 000 kutset capget().

Seda saab kindlasti optimeerida.

Capabilities atribuut? Ei.

JĂ€rgides 10-aastase vana vea nĂ”uandeid. 10-aastane tĂ”rge, me pĂŒĂŒdsime attribuudi kontrolli vĂ€lja lĂŒlitada vĂ”imed:

$ 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 kokku

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

Vau, kiirus 8 sekundi peale! Me vabanesime kÔikidest neist kallistest kutsumistest getxattr(), ja kutsumised capget() katkestasid samuti, suurepÀrane.

Aga need tĂŒĂŒtud kutsumised jĂ€id veel alles lstat(), kuigi


Mitu vÀrvi on vajalik?

SeetÔttu vaatasime seda lÀhemalt LS_COLORS.

Esiteks lĂŒlitasime selle muutujast 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

Mis ta!?! Endiselt 13 sekundit?

Selgub, et kui keskkonnamuutuja LS_COLORS ei ole mÀÀratletud vĂ”i puudub vaid ĂŒks tema elementidest =color:, see kasutab vaikimisi sisseehitatud andmebaasi ja kasutab ikkagi vĂ€rve. SeetĂ”ttu, kui soovite teatud failitĂŒĂŒbi jaoks vĂ€rvuse vĂ€lja lĂŒlitada, peate selle ĂŒle mÀÀrama =: vĂ”i 00 failis DIR_COLORS.

PĂ€rast mitmeid katseid ja eksimusi kitsendasime otsingut sellele:

EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00

mis registreeritakse kui

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

See tÀhendab: Àra vÀrvi faile ei atribuudi vÔimed, vaid bitide setuid/setgid, ega tÀitmise lipu.

Kiirendame ls

Ja kui ei tehta ĂŒhtegi neist kontrollidest, siis kutsed 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 faili nimekirja, rekord.

Seame Sherlocki ĂŒles

Alates 13 sekundist vaikeseadistustega kuni 0,3 sekundi vÀikese seadistusega LS_COLORS tÀhendab 40-kordset kiiruskasvu tÀnu puudumisele setuid / setgid ja vÀrviliste tÀidetud failide. Mitte nii suur kaotus.

Loomulikult on see nĂŒĂŒd seadistatud Sherlockis igale kasutajale.

Aga kui soovite vÀrvimist tagasi, vÔite lihtsalt naasta vaikeseadete juurde:

$ unset LS_COLORS

Aga siis, kui teil on kataloogis palju faile, keetke kindlasti kohvi, kuni see töötab ls.

Allikas: habr.com

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