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, (ja kui te ei tea failidest (do), siis dir_colors , 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.699s12,7 sekundit 10 000 faili jaoks, mitte just vĂ€ga hĂ€sti.
Muide, on vaja lippu
--color=always: kuigi see muutubls --color=auto, agalstuvastab, kui see ei ole ĂŒhendatud terminaliga (nt ĂŒle kanali vĂ”i vĂ€ljundi suunamise kaudu) ja keelab vĂ€rvi, kui vÀÀrtus onauto. 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. , me pĂŒĂŒdsime attribuudi kontrolli vĂ€lja lĂŒlitada :
$ 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 00mis registreeritakse kui
LS_COLORS='ex=00:su=00:sg=00:ca=00:' See tÀhendab: Àra vÀrvi faile ei atribuudi , vaid bitide , ega .
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.029s0,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
