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, (ja kui te failidest ei tea (do), seejĂ€rel dir_colors , 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.699s12,7 sekundit 10 000 faili jaoks, mitte eriti hea.
Muide, me vajame lippu
--color=always: kuigi ta pöördub poolels --color=autoKuidlstuvastab, kui see pole terminaliga ĂŒhendatud (nt toru kaudu vĂ”i vĂ€ljundi ĂŒmbersuunamisega) ja keelab vĂ€rvimise, kui see on mÀÀratudauto. 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 , proovisime atribuutide kontrollimist keelata :
$ 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 00mis on kirjutatud kui
LS_COLORS='ex=00:su=00:sg=00:ca=00:' See tÀhendab: Àrge vÀrvige faile atribuudi jÀrgi. , aga vÀhehaaval , ka mitte .
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.029s0,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
